-1

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

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

    return 42;
}

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

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

4

3 回答 3

2

我建议寻找一种替代方法。您的垃圾对象PassedIn 传递了对香蕉的引用。您可以将其设为 nil,但实际的香蕉不会发生任何事情。

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

于 2012-09-13T17:13:59.070 回答
2

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

将方法声明更改为

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

并通过调用传递值

int result = [self trashObjectPassedIn:&banana];

然后在方法内你可以设置值:

*banana = nil;
于 2012-09-13T18:23:26.730 回答
2

假设您使用的是 ARC,并且您的实例变量是一个strong引用,请这样做:

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

这样可以防止对象泄漏。请注意,这不适用于weak引用。如果您不使用 ARC,我认为要使其正常和安全地工作要困难得多。

编辑:忘记显示如何调用它:您的实例变量[self trashObjectPassedIn:&_myBanana]在哪里。_myBanana

于 2012-09-13T20:56:37.667 回答