nil和release的问题?

时间:2011-05-30 11:45:21

标签: iphone objective-c xcode nsarray release

我正在使用名为 allAvailableServices 的NSArray。 首先我初始化它并在写完[allAvailableServices release];之后 然后我检查了条件 if(allAvailableServices)。  它是真的!我可能知道原因。 然后我写道 allAvailableServices = nil;[allAvailableServices release]; 在上面的代码 if(allAvailableServices)之后出现错误。我在[allAvailableServices release];

之后写了allAvailableServices = nil;的任何问题

每当allAvailableServices = nil我需要分配新的数组。如果我没有调用[allAvailableServices release];我认为存在内存问题。我是否正确? 任何人都可以为我提供最好的处理方式吗?

2 个答案:

答案 0 :(得分:7)

Release只是回收内存,但指针值没有改变;它仍然包含一个值,但它指向垃圾。

这就是为什么许多人在释放它之后会把它们的指针弄错:

[allAvailableServices release], allAvailableServices = nil;

在Objective-C中,将消息发送到nil是安全的,但是向已发布的对象发送消息可能会导致应用程序崩溃(通常使用EXC_BAD_ACCESS)

注意,我在将对象设置为nil之前已经释放了该对象。如果你反过来这样做,你已经丢失了发送消息的指针,所以你泄漏了对象。

答案 1 :(得分:1)

如果使用访问器,则可以直接将值设置为nil,它会调用release并将它们设置为nil。释放将引用计数递减1,如果它达到0,则释放对象。

如果你没有设置为nil,那么内存仍然有一些值,因此你的if条件会出现问题。

更清洁的方法是使用访问者并调用self.yourvariable = nil;