Ich versuche, Delegation für eine Klasse zu implementieren, die es Delegat (falls vorhanden) nennen sollte, wenn spezielle Dinge passieren.Wie kann die Delegierung richtig implementiert werden?
aus Wikipedia habe ich diesen Code Beispiel:
@implementation TCScrollView
-(void)scrollToPoint:(NSPoint)to;
{
BOOL shouldScroll = YES;
// If we have a delegate, and that delegate indeed does implement our delegate method,
if(delegate && [delegate respondsToSelector:@selector(scrollView:shouldScrollToPoint:)])
shouldScroll = [delegate scrollView:self shouldScrollToPoint:to]; // ask it if it's okay to scroll to this point.
if(!shouldScroll) return; // If not, ignore the scroll request.
/// Scrolling code omitted.
}
@end
Wenn ich versuche die alleine, erhalte ich eine Warnung, dass die Methode, die ich auf den Delegierten nenne wurde nicht gefunden. Natürlich war es nicht, weil der Delegat nur durch ID referenziert wird. Es könnte alles sein. Sicher zur Laufzeit, das wird gut funktionieren, weil ich überprüfe, ob es auf selector reagiert. Aber ich will die Warnung in Xcode nicht. Gibt es bessere Muster?
Sie müssen in objective-c nicht nach nil suchen. Es ist zulässig, eine Nachricht an ein Nullobjekt zu senden. – Lounges
In diesem Fall müssen Sie nicht nach nil suchen, da ein BOOL kleiner als sizeof (void *) ist. Für jeden anderen Rückgabetyp, z. B. eine große Struktur, ist der Rückgabewert jedoch undefiniert, und daher ist die Überprüfung auf Null der einzige Weg, um undefiniertes Verhalten zu verhindern. – bbum