我是Objective-C的新手,不得不分配和释放内存。我发现有时当我在重新分配指针之前尝试使用[ptr release]
时,我最后会使用SIGABRT
,而如果我使用ptr = nil
我不会,但我是不确定是否实际释放了指针所指向的内容。所以我想确切地知道ptr = nil
做了什么,而不是[ptr release]
。
答案 0 :(得分:4)
这可能是一个问题,缺乏对Cocoa的内存管理规则的理解,特别是与对象所有权有关。根据您创建对象的方式,您拥有它或其他东西。是否需要释放对象取决于您是否拥有该对象(您已保留该对象,或者您是使用以alloc
开头的方法创建的,new
,copy
,或mutableCopy
)。您可以在Apple's documentation on memory management中详细了解有关规则的详细信息。
此外,您应该注意有关属性的任何规则。正如塞尔吉奥所提到的,如果一个属性指定它保留一个对象,它将在分配时处理对retain
和release
的调用。因此,例如,如果使用alloc
分配内容,则拥有该对象。如果然后将其分配给保留对象的属性,则和属性将保留该对象,因此根据您之后所做的操作,您可能还希望释放该对象以放弃所有权对象。
设置一个指向nil
的简单指针不会释放该对象,也不会算作release
。因此,根据您创建对象的方式,您应该知道是否需要释放对象。上面链接的文档包含的示例可以帮助您加快速度。需要注意的是:由于您没有对retain
,release
等进行任何处理,因此会对自动引用计数进行一些更改,并且编译器会接管大多数情况下,但如果您不使用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
指向的内存地址。