我知道在objective-c運行時有一些函數允許你直接創建對象,比如class_createInstance。我想知道的是,如果有什麼實際使用這些函數,而不是根類(NSObject)的alloc方法。我認爲像KVC綁定這樣的東西可能會有,但那些不在iPhone OS上(據我所知,如果我錯了,請糾正我),那麼有沒有什麼可以做到這一點?是否在不經過alloc的情況下創建了objective-c中的對象?
如果你想知道/它很重要,我期望分配一個實例的大小,以繞過objc運行時,通過聲明一個類沒有ivars,但覆蓋+ alloc方法並調用class_createInstance (自我,myivarsbytes)。
感謝
編輯 我想我需要更加具體。我在運行時將類添加到運行時,並可能卸載並重新加載相同類的更改版本。到目前爲止,我已經解決了大部分問題,因爲class_addMethod之類的東西,但是在類註冊後,沒有與ivars等效的東西。我所能想到的兩種解決方案,就運行時而言,沒有實際的ivars,但是覆蓋alloc以確保我有足夠的空間通過extraBytes,或者聲明一個指向我所有實際ivars的指針,那我顯然可以做任何我想要的。我寧願使用前一種策略,但有很多事情可能會出錯,例如,如果某些事情沒有通過我的重載alloc方法分配對象的實例。有誰知道這些事情之一?
哦,但我剛剛看到你正在嘗試做什麼。好吧,爲了好玩,可以玩它,但我不會嘗試它的實際使用。這就是那種讓你後悔的黑客行爲,希望你把它吸了起來,並以正常的方式去做。如果在框架中有這樣的通用黑客攻擊是很好的,那麼可以說,如果將gc添加到手機中,它可以正確適應垃圾收集。你可以把伊娃做成ivars的東西,或者你可能想看看objc_getAssociatedObject/objc_setAssociatedObject。這些基本上自動化有一個額外的東西在你的對象字典。 – Ken 2010-04-18 20:52:08
另一方面,如果這是爲了加快編譯/運行/調試周期,並且您在應用中發佈的內容將不會使用它,那聽起來很有趣,就是爲了它。 :-)雖然..你可能想看看ZeroLink,。這是爲了加速開發,並按照您的描述工作,重新加載代碼等。蘋果公司放棄了它 - 通常解決一些奇怪的問題是「關閉zerolink」。 –
Ken
2010-04-18 20:59:19
我投了這個allocWithZone:和NSLock的例子,但我不能真正接受,因爲它不符合不通過allocWithZone調用的東西的標準。此外,這將是生產代碼的基礎,所以我可能不會這樣做,因爲你的NSLock示例 - 它最終會打破使用該技術的任何NSLock子類。 – 2010-04-19 00:02:27