Nun, hier sind viele Antworten, aber da dies ein wenig anders ist, kombiniere ich ein paar Antworten, die ich dachte, dass ich sie einfügen würde. Ich benutze eine NSObject-Kategorie, die überprüft, ob der Selektor void zurückgibt, und unterdrückt auch die Compilerwarnung.
#import
#import
#import "Debug.h" // nicht gegeben; nur eine Behauptung
@interface NSObject (Extras)
// Verfolgen Sie die Regel, dass der verwendete Selektor void zurückgeben muss.
- (void) performVoidReturnSelector:(SEL)aSelector withObject:(id)object;
- (void) performVoidReturnSelector:(SEL)aSelector;
@end
@implementation NSObject (Extras)
// Anscheinend gibt die reguläre performSelect eine Warnung zur Kompilierzeit aus, weil das System den Rückgabetyp nicht kennt. Ich werde (a) sicherstellen, dass der Rückgabetyp void ist und (b) diese Warnung deaktivieren
// Siehe http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown
- (void) checkSelector:(SEL)aSelector {
// Siehe http://stackoverflow.com/questions/14602854/objective-c-is-there-a-way-to-check-a-selector-return-value
Method m = class_getInstanceMethod([self class], aSelector);
char type[128];
method_getReturnType(m, type, sizeof(type));
NSString *message = [[NSString alloc] initWithFormat:@"NSObject+Extras.performVoidReturnSelector: %@.%@ selector (type: %s)", [self class], NSStringFromSelector(aSelector), type];
NSLog(@"%@", message);
if (type[0] != 'v') {
message = [[NSString alloc] initWithFormat:@"%@ war nicht void", message];
[Debug assertTrue:FALSE withMessage:message];
}
}
- (void) performVoidReturnSelector:(SEL)aSelector withObject:(id)object {
[self checkSelector:aSelector];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
// Da der Selektor (aSelector) void zurückgibt, ergibt es keinen Sinn, zu versuchen, das Rückgabeergebnis von performSelector zu erhalten. Tatsächlich stürzt die App ab, wenn wir es tun.
[self performSelector: aSelector withObject: object];
#pragma clang diagnostic pop
}
- (void) performVoidReturnSelector:(SEL)aSelector {
[self checkSelector:aSelector];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self performSelector: aSelector];
#pragma clang diagnostic pop
}
@end