2014-11-22 11 views
0

我讀了Customizing Existing ClassesObjective-C Runtime Reference的蘋果開發者文檔。使用objc_setAssociated和objc_getAssociated的條件

我想知道objc_getAssociatedObjectobjc_setAssociatedObject方法是否必須與CATEGORY一起使用。

是否意味着類別用於定製方法和objc_getAssociatedObjectobjc_setAssociatedObject是用於定製(通常添加)伊娃?

是感覺使用上面的方法分別添加另一個實例變量嗎?

如果是,那麼添加實例變量的條件是什麼?

謝謝。

最新編輯:

ViewController.m

[XXView showView:[UIColor greenColor]]; 

XXView.m

+ (void)showView: (UIColor *)bgcolor { 
    XXViewController *vc = [[XXViewController alloc] init]; 
    vc.backgroundColor = [self BackgroundColor]; 
} 

+ (void)setBackgroundColor:(UIColor *)BackgroundColor { 
    objc_setAssociatedObject(self, @selector(backgroundColor), BackgroundColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

+ (UIColor *)BackgroundColor { 
    if (!objc_getAssociatedObject(self, _cmd)) { 
    [self setBackgroundColor:[UIColor redColor]]; 
    } 
    return objc_getAssociatedObject(self, _cmd); 
} 

回答

0

相關聯的對象功能可以在任何可以使用代碼;代碼只需要引用與其關聯另一個對象的對象,對希望關聯的對象的引用以及對唯一鍵值的訪問。

所以是的,你可以在類別方法中使用它們,這是一種實現類似於通過類別方法創建和維護的實例變量的方法。

對於唯一的鍵值使用靜態變量的地址 - 只是聲明瞭這樣一個變量,任何類型都會像你只使用它的地址一樣,在你定義類別方法的同一個文件中。由於程序中的每個地址都是唯一的,因此使用地址。

對於策略參數,您可能需要OBJC_ASSOCIATION_RETAIN,這意味着關聯的對象引用將與關聯對象一起保留和釋放 - 這模仿ARC下實例變量的默認行爲。

不完全確定你在問什麼「添加實例變量的條件」,唯一的條件是鍵必須是唯一的,而且你只能關聯對象引用 - 沒有原始值,但如果需要通過關聯一個包含原始值屬性的對象。如果您希望關聯多個對象(「添加多個實例變量」),那麼將單個對象與多個屬性關聯是值得考慮的。

HTH