我想分配nil
给一个对象,它是一个 ivar,作为参数传递给一个方法,就像这样。
- (int)trashObjectPassedIn:(Banana* banana) {
banana = nil;
return 42;
}
当然,如果我这样称呼它:[self trashObjectPassedIn:oldBanana];
oldBanana is untouched - 只分配了本地参数。
有什么方法可以分配nil
给原始对象吗?
我想分配nil
给一个对象,它是一个 ivar,作为参数传递给一个方法,就像这样。
- (int)trashObjectPassedIn:(Banana* banana) {
banana = nil;
return 42;
}
当然,如果我这样称呼它:[self trashObjectPassedIn:oldBanana];
oldBanana is untouched - 只分配了本地参数。
有什么方法可以分配nil
给原始对象吗?
我建议寻找一种替代方法。您的垃圾对象PassedIn 传递了对香蕉的引用。您可以将其设为 nil,但实际的香蕉不会发生任何事情。
如果您希望删除香蕉(并且您正在使用 ARC),那么您应该将拥有香蕉的属性或成员变量设为 nil。
虽然这看起来很奇怪,但有一些(虽然不是很多)合理的理由这样做,您可以通过将指针传递给您的对象指针来做到这一点。这称为按引用传递,其中目标 c 通常是按值传递。你可以在任何接受 NSError 的方法中看到它在 Cocoa 中被使用,例如save:
在NSManagedObjectContext
. 这个答案有更详细的描述
将方法声明更改为
- (int)trashObjectPassedIn:(Banana **)banana
并通过调用传递值
int result = [self trashObjectPassedIn:&banana];
然后在方法内你可以设置值:
*banana = nil;
假设您使用的是 ARC,并且您的实例变量是一个strong
引用,请这样做:
- (int)trashObjectPassedIn:(Banana *__strong *)banana)
{
*banana = nil;
return 42;
}
这样可以防止对象泄漏。请注意,这不适用于weak
引用。如果您不使用 ARC,我认为要使其正常和安全地工作要困难得多。
编辑:忘记显示如何调用它:您的实例变量[self trashObjectPassedIn:&_myBanana]
在哪里。_myBanana