2013-07-26 53 views
0

我想在運行時將ivar添加到現有的objective-c類中,但是文檔指出ivar不能是現有的類,所以我認爲屬性仍然可以解決我的問題。Objective C - 在運行時添加屬性

如陳述here class_addProperty(...)返回true,但是當我試圖通過它的名稱(或屬性名稱)訪問ivar時,它總是返回nil。造成這種情況的原因是什麼?

+2

從表面上看,這是一個糟糕的主意......想要在運行時添加它的原因是什麼? – Ben

+0

這是你需要顯示你的代碼的問題,你爲getter和setter做了什麼? –

+0

@Ben - 因爲類是框架的一部分,我無法訪問它的源代碼。我可以擴展這個類並添加屬性,但是我嘗試了一些不同的東西,因爲我不確定是否繼承子類會影響框架的工作流。 – Mercurial

回答

1

您將無法在運行時向該類添加ivar。你可以將這個類和它的ivars想象成類似C結構的東西。它的佈局是在編譯時定義的。

你可以在運行時添加屬性(因爲這些只是方法),你可以實現他們的getter和setter,但是你需要想出一個不同的方式來存儲他們所代表的數據。

+0

的原始類如果你是對的,那麼它就非常有意義。爲了爭論,我能否在某種程度上改變編譯時的結構? :)我已經讀了一下它,並且文檔狀態(關於class_addIvar):「這個函數只能在objc_allocateClassPair之前和objc_registerClassPair之前調用,不支持向現有類中添加實例變量。」 – Mercurial

+1

我不確定在編譯時你需要做什麼?你可以用宏或C++模板做一些魔術,但我懷疑它會適用於許多真實世界的場景。如果你真的需要動態創建一個類,或者只是對Objective-C的理論工作感興趣,那麼這可能是最好的指導:http://www.mikeash.com/pyblog/friday-qa-2010-11 -6-創建類-AT-運行時在目標-c.html – adpalumbo

0

您是否在尋找類似於其他一些編程語言的東西?

它看起來像在AS3中添加屬性,但objc認爲你最好使用鍵來存儲NSDictionary對象。