将nil分配给传递给方法的成员变量

时间:2012-09-13 17:08:39

标签: objective-c instance-variables local-variables

我想将nil分配给一个对象,这是一个ivar,作为参数传递给方法,就像这样。

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

    return 42;
}

当然,如果我这样称呼它:[self trashObjectPassedIn:oldBanana]; oldBanana不受影响 - 只分配了本地参数。

我有什么方法可以将nil分配给原始对象吗?

3 个答案:

答案 0 :(得分:2)

我建议找一种替代方法。您的trashObjectPassedIn会将引用传递给banana。你可以这样,但真正的香蕉不会发生任何事情。

如果您希望删除香蕉(并且您正在使用ARC),那么您应该忽略拥有香蕉的属性或成员变量。

答案 1 :(得分:2)

虽然这看起来很奇怪,但有一些(尽管不是很多)合理的理由这样做,你可以通过传递一个指向你的对象指针的指针来做到这一点。这称为按引用传递,其中目标c通常按值传递。您可以在任何接受NSError的方法中看到这在Cocoa中使用,例如save:中的NSManagedObjectContextThis answer有更详细的说明

将方法声明更改为

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

并通过调用

传递该值
int result = [self trashObjectPassedIn:&banana];

然后在方法内部设置值:

*banana = nil;

答案 2 :(得分:2)

假设您正在使用ARC,并且您的实例变量是strong引用,请执行以下操作:

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

这可以防止物体泄漏。请注意,这不适用于weak引用。如果您不使用ARC,我认为要使其普遍安全地工作会更加困难。

修改:忘记显示如何调用它:[self trashObjectPassedIn:&_myBanana]其中_myBanana是您的实例变量。