Objective-C中的'ptr = nil'vs'[ptr release]'?

时间:2011-07-08 22:23:34

标签: objective-c memory pointers

我是Objective-C的新手,不得不分配和释放内存。我发现有时当我在重新分配指针之前尝试使用[ptr release]时,我最后会使用SIGABRT,而如果我使用ptr = nil我不会,但我是不确定是否实际释放了指针所指向的内容。所以我想确切地知道ptr = nil做了什么,而不是[ptr release]

3 个答案:

答案 0 :(得分:4)

这可能是一个问题,缺乏对Cocoa的内存管理规则的理解,特别是与对象所有权有关。根据您创建对象的方式,您拥有它或其他东西。是否需要释放对象取决于您是否拥有该对象(您已保留该对象,或者您是使用以alloc开头的方法创建的,newcopy ,或mutableCopy)。您可以在Apple's documentation on memory management中详细了解有关规则的详细信息。

此外,您应该注意有关属性的任何规则。正如塞尔吉奥所提到的,如果一个属性指定它保留一个对象,它将在分配时处理对retainrelease的调用。因此,例如,如果使用alloc分配内容,则拥有该对象。如果然后将其分配给保留对象的属性,则属性将保留该对象,因此根据您之后所做的操作,您可能还希望释放该对象以放弃所有权对象。

设置一个指向nil的简单指针不会释放该对象,也不会算作release。因此,根据您创建对象的方式,您应该知道是否需要释放对象。上面链接的文档包含的示例可以帮助您加快速度。需要注意的是:由于您没有对retainrelease等进行任何处理,因此会对自动引用计数进行一些更改,并且编译器会接管大多数情况下,但如果您不使用ARC,请不要担心(但稍后会担心)。

答案 1 :(得分:3)

ptr = nil会使您的ptr变量的值为零,并且不会释放指针;所以它在没有SIGABRT的情况下工作的原因是对象没有得到dealloc'ed。

当您分配到nil媒体资源时,分配release也意味着retain

@property(nonatomic, retain) .... ptr;
.....
self.ptr = nil;

优良作法是遵循release语句并赋值为nil:

[ptr release];
ptr = nil;

这样可以防止在释放后对释放的对象进行任何不必要的使用(这对于可以在不同方法中使用的类ivars来说很有意义。)

如果你能提供一些显示SIGABRT的代码,那么就更容易被发现。

答案 2 :(得分:3)

使用:

[ptr release];

您实际上正在递减retainCount的{​​{1}}。如果ptr的{​​{1}}降至0,则retainCount将被释放,内存也将被释放。

当您编写ptr时,您只是'重置'ptr指向的内存地址。