2012-10-14 62 views
0

我有一個Objective-C類,它的實例可以檢測到它們不再需要時會自我銷燬,但我正在尋找一種安全的方法從對象本身中觸發對象的自毀,不以某種方式「破壞正在調用銷燬方法」 ...我的代碼看起來大致是這樣的(爲簡潔一些刪除):從自我內部破壞自我

+ (oneway void)destroyInstance:(id)obj { 

    printf("Destroying.\n"); 
    if (obj != nil) { 
     free(obj); 
     obj = nil; 
    } 

} 

- (oneway void)release { 

    _noLongerRequired = [self determineIfNeeded]; // BOOL retVal 

    if (_noLongerRequired) { 
     [self deallocateMemory]; // Free ivars etc (NOT oneway) 
     [MyClass destroyInstance:self]; // Oneway 
    } 
} 

如果我把-release,應該立即返回到主線程(因到oneway)。

同時,如果實例發現它不再需要,它應該調用oneway類方法destroyInstance:並從運行時中刪除它自己。我的問題是,這是安全的嗎?我有沒有正確使用oneway?在我看來,在它返回之前有可能破壞實例的-release函數,這可能是...非常糟糕..?

(PS:很明顯不是在找什麼做的NSObject等:)

+8

如果你需要這個,你的設計被嚴重破壞。 – 2012-10-14 11:35:05

+2

同意,這聽起來像一個壞主意。讓ARC做這項工作有什麼問題?如果你有額外的清潔,你可以把它放在dealloc中。我沒有看到你的問題的用例。如果你在運行時做了一些瘋狂的事情,而不是使用ARC或GC,使用objc_disposeClassPair,但是從另一個對象來做。 – Jano

+0

@Jano ARC不會處理(我假設?)任何不從NSObject繼承的東西,我試圖讓自己的基類和尋找一個合理的銷燬機制 - 卸載到另一個對象看起來相當不錯! – Ephemera

回答

4

這是毫無疑問的,如果你想工作的一個可怕的想法和維護的軟件和不安全在幾乎任何環境。但是有時候可怕的,不安全的想法在週末可能會很有趣,所以我會回答我可以分辨的問題的組成部分。

一個方法不會因爲一個實例被重新分配而被「銷燬」。可能發生的是self最終可能會在執行方法時指向釋放內存,這意味着在此期間訪問self或任何實例變量都可能會崩潰。

至於你的代碼的其餘部分,沒有理由在所有設置obj等於nil+destroyInstance,所以如果你試圖完成特別的東西(nil「荷蘭國際集團出指針指向的對象也許)這種方式是不是正確的方式去做。

考慮使用oneway,語言表示發送此消息不會阻止調用線程。在釋放對象的上下文中,我認爲這是有道理的,因爲大概消息的目標不會再被該線程引用。通過這種邏輯,我認爲你的+destroyInstance的聲明也許可以。我想知道是否需要提供某種類型的同步,以便沒有競爭條件,但考慮到它,取得對象的所有權可能永遠不會是異步的。

我個人的意見是,任何將此代碼投入生產的人都應該被解僱或被起訴= P。但是,如果它僅用於教育目的,請盡情玩樂,並希望這有助於您。

+0

哈哈不用擔心,它絕對只是教育 - 我試圖用我的手來實現我自己的NSObject。 – Ephemera

+0

聽起來像爆炸。讓我們知道怎麼回事! –