2012-12-04 46 views
1

我想首先指出,其實我們「可以」爲什麼我們無法在類別中添加iVar?

只需使用相關對象:

@implementation UIButton (BGButtonWithImages) 

static char UIB_ImageOfButton; 

-(void)setImageObject:(Image *)imageObject 
{ 
    objc_setAssociatedObject(self, &UIB_ImageOfButton, imageObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(Image*)imageObject 
{ 
    return (Image*)objc_getAssociatedObject(self, &UIB_ImageOfButton); 
}  
@end 

但是,這導致了另一個問題。爲什麼使用關聯對象很容易完成的事情不能定期完成?爲什麼蘋果不在這樣的類別中實現屬性?

回答

4

綜合屬性訪問器使用實例變量。您不允許通過類別添加實例變量,因爲不能保證唯一性 - 相同的實例變量可能會被另一個類別添加。

正如您所注意到的,只要您的關聯對象表的關鍵字是唯一的,inside-out object pattern就可以讓您在類別中定義訪問者。繼續使用它是很好的。如果你想要第一方編譯器支持生成這些訪問器,你必須ask Apple

+0

因此,如果你想在類別中的屬性,你只需要自己實現的東西?嗯...蘋果本來可以自動做出這個。 –

+0

如果相同的實例變量可能被另一個類別添加,那麼可以在編譯時將它們排序出來嗎? –

+1

@SharenEayrs不,它不能。雖然這個功能對iOS開發人員不是開放的,但類別可以在運行時動態加載。在編譯任何一個類別時,您不知道還有哪些其他類別。這已經導致另一個問題 - 你不能確定性地將一個類的方法替換成一個類別,因爲它可能也被替換爲另一個類別。 – 2012-12-05 09:17:24

0

我會高興地訴諸所提出的技術,但我的情況有點不舒服。

我的主要對象是一個自動生成的CoreData實體對象。所以我不喜歡在那裏添加實例變量(任何實體對象的重新生成都會將其刪除)。

我的類別是在另一個源中寫入的,用於擴展實體對象(具有各種計算屬性,屬性依賴關係等)。

現在我的一類只讀屬性必須「留下痕跡」並將值存儲在另一個類別屬性中。爲此,它必須將值存儲在某個地方!我需要一個實例變量!

怎麼辦?我在想。

相關問題