正如您所定義的那樣,類A從來沒有保留雙向鏈表。所以不,它沒有任何利害關係。事實上,因爲doublyLinkedList不是由類A保留的,所以在執行過程中可以隨時解除分配,並導致EXEC_BAD_ACCESS崩潰。
有兩種明顯的方法可以解決這個問題。
- A類應該在使用它時保留doublyLinkedList,並在它返回之前自動釋放它。
- 另一個'父'對象可以同時保留doublyLinkedList和類A的實例,並且它取決於'父'對象,以確保在A類對象正在使用它時,doublyLinkedList不會被釋放。
編輯:
如果你的alloc-初始化對象時,你初始化類,如你在上面添加,那麼當一個類被釋放,你應該只釋放對象。這使得一個簡單的對象生命週期。類A的一個實例被創建,它創建一個DLL對象。該對象一直存在,直到類A實例被銷燬。如果其他對象想要使用DLL,他們只需從A類實例中請求它並保留它。
與目標保留髮布是這樣一種方式,你可以確保你有一個偶數保持通話編碼,並在對象上呼籲釋放。對於每一個:
- (id)init {
self = [super init];
if (self) {
doublyLinkedList = [[DoublyLinkedList alloc] init];
}
return self;
}
您需要:
-(void)dealloc {
[super dealloc];
[doublyLinkedList release]
}
如果你的類的對象將被創建和處理多個DLL對象,則不要在-(id)init
創建和使用retain
爲財產申報。 然後:
ClassA *newClassAObject = [[ClassA alloc] init]; // create class a object
newClassAObject.doublyLinkedList = [[[DoublyLinkedList alloc] init] autorelease]; // make a DLL object, only retained by class a object.
DoublyLinkedList *dll = [newClassAObject doSomethingAndReturn]; // process the list somehow
[dll retain] // we own this now
newClassAObject.doublyLinkedList = nil; // class A object gives up interest in dll.
newClassAObject.doublyLinkedList = [[[DoublyLinkedList alloc] init] autorelease]; // now process another one.
... and on and on ...
好的。所以要回答我的問題,「不」,「返回」本身不會放棄對班級創建的任何控制。 – JAM
@mac正確。返回不觸及對象,它只是將引用傳遞給調用者。 –
是的 - 像肯尼說:) – bryanmac