2
正如你可以重寫靜態方法在什麼類別的相當於+ [NSObject的負載]對於類實例上
+ (void)load
{
// do any setup for the class
}
我不知道我該怎麼做同樣的公關實例。是否有必要調整init方法?
正如你可以重寫靜態方法在什麼類別的相當於+ [NSObject的負載]對於類實例上
+ (void)load
{
// do any setup for the class
}
我不知道我該怎麼做同樣的公關實例。是否有必要調整init方法?
不,AFAIK沒有這方法。相反,這樣做
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (XXXCategory)
@end
@implementation NSObject (XXXCategory)
- (void)xxx_setup
{
static void * XXXDidSetupPropertKey;
NSNumber *didSetupValue = objc_getAssociatedObject(self, XXXDidSetupPropertKey); BOOL didSetup = [didSetupValue boolValue];
if(!didSetup)
{
objc_setAssociatedObject(self, XXXDidSetupPropertKey, @YES, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
NSLog(@"Setting up category");
}
}
- (void)xxx_doSomething
{
[self xxx_setup];
NSLog(@"do something");
}
- (void)xxx_doSomethingElse
{
[self xxx_setup];
NSLog(@"do something else");
}
@end
當這樣
NSObject *obj = [[NSObject alloc] init];
[obj xxx_doSomething];
[obj xxx_doSomethingElse];
測試的結果是
2014-02-28 10:21:04.024 Untitled 2[27026:507] Setting up category
2014-02-28 10:21:04.025 Untitled 2[27026:507] do something
2014-02-28 10:21:04.026 Untitled 2[27026:507] do something else
所以主要目的是有一些代碼,將每次調用的時候任何物體正在初始化?我對嗎? –
@ tt.Kilew correct – hfossli
我找不到任何可能的解決方案,但是調用'NSObject類'的'init'方法,但是當你這樣做時,你需要非常小心並且禁用ARC以用於所使用的代碼在swizzled init中。這是因爲在iOS中有很多對象是[NSObject類]的子類,但會立即崩潰在ARC的任何-retain或-release中。請看這裏https://github.com/DyCI/dyci-main/ blob/master/Dynamic%20Code%20Injection/dyci/Classes/Injections/NSObject%2BDyCInjection.m –