Zum Beispiel zurückkehren, kann folgenden Code unter ARC betrachten:Swizzling Methoden, die implizit ein beibehaltene Objekt unter ARC
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@implementation NSDate (MyEvilHack)
+ (void)load {
Method originalMethod = class_getInstanceMethod(self, @selector(copyWithZone:));
Method newMethod = class_getInstanceMethod(self, @selector(myCopyWithZone:));
method_exchangeImplementations(originalMethod, newMethod);
}
- (id)myCopyWithZone:(NSZone *)zone {
id result = [self myCopyWithZone:zone];
// do customization
return result;
}
@end
In diesem Code ursprüngliche copyWithZone:
Methode zurückgibt implizit ein beibehaltene Objekt, weil es zu copy
gehört Methodenfamilie. Aber meine myCopyWithZone:
ist nicht.
Ich erwarte Absturz, aber sieht aus wie dieser Code normal funktioniert. Natürlich kann ich meine Methode umbenennen, um Verwirrung zu vermeiden. Aber ich bin gespannt was genau unter der Haube passiert?