2012-09-13 76 views
-1

我想將nil分配給作爲參數傳入方法的對象,這是一個ivar,如下所示。將nil分配給傳遞給方法的成員變量

- (int)trashObjectPassedIn:(Banana* banana) { 
    banana = nil; 

    return 42; 
} 

當然,如果我這樣稱呼它:[self trashObjectPassedIn:oldBanana]; oldBanana是不變 - 僅在本地參數被分配。

有什麼辦法可以將nil分配給原始對象嗎?

+1

不,沒有辦法做到這一點。好的,可能會有一些不好的方法,但是如果有的話請不要使用它,因爲它會導致各種問題,尤其是在使用ARC時。 –

+0

你能解釋一下爲什麼你不能在調用上下文中將它設置爲'nil'? –

+1

你能解釋一下你爲什麼要這樣做嗎?也許我們可以提供替代解決方案? –

回答

2

我建議找到一種替代方法。你的trashObjectPassedIn通過一個參考到香蕉。你可以沒有,但實際香蕉沒有任何事情發生。

如果您想要刪除香蕉(並且您正在使用ARC),那麼您應該不包含擁有香蕉的屬性或成員變量。

2

雖然這看起來很奇怪,但有一些(儘管不是很多)正當理由來做到這一點,你可以通過傳遞一個指向你的對象指針的指針來做到這一點。這稱爲通過引用,其中目標c通常是按值傳遞。你可以在接受NSError的任何方法中看到這個在Cocoa中使用,例如,​​in NSManagedObjectContextThis answer有更詳細的描述

變化方法聲明是

- (int)trashObjectPassedIn:(Banana **)banana 

,並通過調用

int result = [self trashObjectPassedIn:&banana]; 

傳遞的值,然後該方法內可以設置的值:

*banana = nil; 
+0

在這種特殊情況下,這會泄漏'banana'指向的對象。 –

+0

謝謝,我不確定這一點。我認爲它不太可能是這個問題的答案,無論如何,在調用上下文中忽略這個值似乎更簡單了 – wattson12

+0

是的,它在ARC和MRR下泄漏,你必須先自動釋放它(可能在呼叫端)。但我同意你的看法,如果你足夠接近一個目標來做這件事,那麼做對,即通過財產。 –

2

假設您使用ARC和您的實例變量是一個strong參考,請這樣做:

- (int)trashObjectPassedIn:(Banana *__strong *)banana) 
{ 
    *banana = nil; 
    return 42; 
} 

這可以防止物體泄漏。請注意,這不適用於weak參考。如果你沒有使用ARC,我認爲這樣做通常和安全地工作要困難得多。

編輯:忘了展示如何稱呼它:[self trashObjectPassedIn:&_myBanana]其中_myBanana是你的實例變量。