2011-01-13 4 views
0

Wenn der folgende Code ausgeführt wirdperform trifft nicht Breakpoint im Debug-Modus

style = [self performSelector:sel withObject:(id)state]; 

Der Haltepunkt in sel nicht getroffen. Ist das normales Verhalten?

NSString* key = state == UIControlStateNormal 
    ? selector 
    : [NSString stringWithFormat:@"%@%d", selector, state]; 
    TTStyle* style = [_styles objectForKey:key]; 
    if (!style) { 
    SEL sel = NSSelectorFromString(selector); 
    if ([self respondsToSelector:sel]) { 
     style = [self performSelector:sel withObject:(id)state]; 
     if (style) { 
     if (!_styles) { 
      _styles = [[NSMutableDictionary alloc] init]; 
     } 
     [_styles setObject:style forKey:key]; 
     } 
    } 
    } 
+0

Nein, das ist nicht normal. Versuchen Sie '[self responsesToSelector: sel]' und sehen Sie, ob es 'YES' zurückgibt. –

+0

Also reagiert die Funktion auf diesen Selektor. Dies ist ein Schnappschuss aus dem Code von three20style. Was ich sehe ist, dass die Funktion aufgerufen wird, aber die zurückgegebenen Werte sind falsch. Wenn ich den Haltepunkt platziere, wird er nicht getroffen – user210504

Antwort

1

In einem Ihrer Kommentare zu Ihrem Post erwähnen Sie, dass dieser Code aus der three20style-Bibliothek stammt und dass er nicht platziert wird, wenn Sie den Breakpoint platzieren. Wahrscheinlich folgen Sie der von Three20 empfohlenen Vorgehensweise zum Verknüpfen der Three20-Bibliotheken: Im Abschnitt "Weitere Linker-Flags" der Build-Einstellungen haben Sie wahrscheinlich eine ganze Reihe von -force-load-Argumenten, so etwas wie diese:

-force-load libThree20UICommon.a -force-load libThree20.a ... 

Das Problem ist, es stellt sich heraus, dass wenn Sie auf diese Weise verbinden, Breakpoints nicht funktionieren. Als Abhilfe kann nur in Ihrer Debug Konfiguration (nicht in der Release-Konfiguration), entfernen Sie all diese Argumente aus dem „Other Linker Flags“, und setzen Sie diese in statt:

-all_load -ObjC 

Ich bin nicht vertraut mit dem genauen Unterschied zwischen diesen Flags; Alles, was ich weiß ist, mit -all_load -ObjC können Sie Ihre Breakpoints funktionieren. Ich würde nicht empfehlen, die Einstellung für die Release-Konfiguration zu ändern, da ich mir der genauen Auswirkung der Änderung nicht sicher bin.

+0

Ich habe das Wiki vermisst. Danke für das Aufzeigen. – user210504

+0

Ich bevorzuge die Dummy-Klasse Lösung, wie hier vorgeschlagen: http://blog.binaryfinery.com/universal-static-library-problem-in-iphone-sd Stellen Sie sicher, dass Sie das Makro in der .m-Datei, nicht die Header, um doppelte Symbolfehler zu vermeiden. – LearnCocos2D

0

Versuchen Sie style = [self performSelector: @selector (sel) withObject: (id) state];