我想將nil
分配給作爲參數傳入方法的對象,這是一個ivar,如下所示。將nil分配給傳遞給方法的成員變量
- (int)trashObjectPassedIn:(Banana* banana) {
banana = nil;
return 42;
}
當然,如果我這樣稱呼它:[self trashObjectPassedIn:oldBanana];
oldBanana是不變 - 僅在本地參數被分配。
有什麼辦法可以將nil
分配給原始對象嗎?
我想將nil
分配給作爲參數傳入方法的對象,這是一個ivar,如下所示。將nil分配給傳遞給方法的成員變量
- (int)trashObjectPassedIn:(Banana* banana) {
banana = nil;
return 42;
}
當然,如果我這樣稱呼它:[self trashObjectPassedIn:oldBanana];
oldBanana是不變 - 僅在本地參數被分配。
有什麼辦法可以將nil
分配給原始對象嗎?
我建議找到一種替代方法。你的trashObjectPassedIn通過一個參考到香蕉。你可以沒有,但實際香蕉沒有任何事情發生。
如果您想要刪除香蕉(並且您正在使用ARC),那麼您應該不包含擁有香蕉的屬性或成員變量。
雖然這看起來很奇怪,但有一些(儘管不是很多)正當理由來做到這一點,你可以通過傳遞一個指向你的對象指針的指針來做到這一點。這稱爲通過引用,其中目標c通常是按值傳遞。你可以在接受NSError的任何方法中看到這個在Cocoa中使用,例如,in NSManagedObjectContext
。 This answer有更詳細的描述
變化方法聲明是
- (int)trashObjectPassedIn:(Banana **)banana
,並通過調用
int result = [self trashObjectPassedIn:&banana];
傳遞的值,然後該方法內可以設置的值:
*banana = nil;
在這種特殊情況下,這會泄漏'banana'指向的對象。 –
謝謝,我不確定這一點。我認爲它不太可能是這個問題的答案,無論如何,在調用上下文中忽略這個值似乎更簡單了 – wattson12
是的,它在ARC和MRR下泄漏,你必須先自動釋放它(可能在呼叫端)。但我同意你的看法,如果你足夠接近一個目標來做這件事,那麼做對,即通過財產。 –
假設您使用ARC和您的實例變量是一個strong
參考,請這樣做:
- (int)trashObjectPassedIn:(Banana *__strong *)banana)
{
*banana = nil;
return 42;
}
這可以防止物體泄漏。請注意,這不適用於weak
參考。如果你沒有使用ARC,我認爲這樣做通常和安全地工作要困難得多。
編輯:忘了展示如何稱呼它:[self trashObjectPassedIn:&_myBanana]
其中_myBanana
是你的實例變量。
不,沒有辦法做到這一點。好的,可能會有一些不好的方法,但是如果有的話請不要使用它,因爲它會導致各種問題,尤其是在使用ARC時。 –
你能解釋一下爲什麼你不能在調用上下文中將它設置爲'nil'? –
你能解釋一下你爲什麼要這樣做嗎?也許我們可以提供替代解決方案? –