2011-05-30 67 views
0

我使用的NSArray名为allAvailableServices。 首先我初始化它,之后写了[allAvailableServices release]; 然后我检查了条件if(allAvailableServices)。 它是真的! 我可能知道原因。 后来我写了 allAvailableServices = nil;[allAvailableServices release]; 上面的代码后,如果(allAvailableServices)来到false.is那里,我以后allAvailableServices = nil;零和释放的问题?

写道[allAvailableServices release];每当allAvailableServices = nil我需要分配新array.so如果我没任何问题打电话[allAvailableServices release];我想有一个记忆问题,我纠正了吗? 任何人都可以为我提供一个处理它的最佳方式吗?

回答

7

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

这就是为什么许多人将其释放后NIL其指针:

[allAvailableServices release], allAvailableServices = nil; 

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

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

1

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

如果您不设置为nil,并且因此在if条件中存在问题,则内存仍具有一些值。

更清洁的方式是使用访问器并致电self.yourvariable = nil;

+0

+1用于提示属性。 [属性](http://programmers.stackexchange.com/questions/36262/what-guidelines-do-you-suggest-for-using-objective-c-properties/78328#78328)而不是ivars帮助*很多*避免内存问题。 – 2011-05-30 11:53:46