2013-05-07 68 views
2

我有一個使用MRC(非ARC)靜態庫的啓用ARC的應用程序。在靜態庫中,retain/release被覆蓋以提供一些自定義的弱引用/緩存行爲(當然稱爲[super retain/release])。問題是由於retain/release在啓用ARC的代碼中不允許,可以使用在啓用ARC的代碼中覆蓋retain/release的類嗎?目前它似乎運行良好,但我不確定這是否依賴未定的行爲,這可能會在未來破裂。覆蓋保留/釋放在ARC

還有什麼理由禁止優先retain/release?是否因爲編譯器做了一些特殊的優化,繞過了消息綁定過程來加速方法調用?我知道_objc_storeStrong調用是由引用計數的編譯器生成的,那麼這是否意味着重寫的retain/release不能保證在ARC下調用?

+0

ARC只是自行維護內存管理,即以簡單的語言根據對象的範圍自動放入保留/釋放代碼。所以,只要不擔心圖書館不啓用ARC,它將不會在將來創建任何問題。 – 2013-05-07 11:54:57

回答

6

只要類沒有ARC(您可以通過文件的基礎文件控制編制;去構建階段,並作爲一個標誌添加-fno-objc-arc到應該編譯MRR的任何文件在ARC'd項目中),那麼MRR編譯的類可以將保留/釋放/自動釋放覆蓋到他們心臟的內容。

在ARC下保留/釋放/ autorelease是verboten,因爲ARC被設計爲在編譯時爲你處理所有的內存管理,同時也迫使你將內存管理與看起來可以堆積到內存管理上的其他角色分開,但是真的不屬於那裏。

例如,release的最典型覆蓋涉及檢查retainCount,如果是2,則轉換爲1意味着「將該對象放回緩存中供以後檢索」,而緩存負責最終的保留對該對象的引用。

它可以工作,但它非常脆弱,有更好的解決方案,不涉及與內存管理共謀緩存。

-4

覆蓋保留/釋放不正確。但如果你需要它:

-(id)retain 
{ 
    NSIncrementExtraRefCount(self); 
    return self; 
} 

-(void)release 
{ 
    if(NSDecrementExtraRefCountWasZero(self)) 
    { 
     NSDeallocateObject(self); 
    } 
} 

-(id)autorelease 
{ // Add the object to the autorelease pool 
    [NSAutoreleasePool addObject:self]; 
    return self; 
} 

我還沒有測試他們的ARC。和原來的文章: link

+0

和我的答案有什麼問題? – user2159978 2013-05-07 13:43:22

+7

您無法在ARC中覆蓋保留/釋放。而且,即使你可以,這也不能回答這個問題。 – bbum 2013-05-07 17:20:45

+0

和?我不能標記這個類只能使用沒有ARC? – user2159978 2013-05-18 14:30:12