2014-01-16 22 views
2

正如你可以重寫靜態方法在什麼類別的相當於+ [NSObject的負載]對於類實例上

+ (void)load 
{ 
    // do any setup for the class 
} 

我不知道我該怎麼做同樣的公關實例。是否有必要調整init方法?

+0

所以主要目的是有一些代碼,將每次調用的時候任何物體正在初始化?我對嗎? –

+0

@ tt.Kilew correct – hfossli

+1

我找不到任何可能的解決方案,但是調用'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 –

回答

0

不,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 
相關問題