';ptr=nil';vs';[ptr发布]';在Objective-C中?

';ptr=nil';vs';[ptr发布]';在Objective-C中?,objective-c,memory,pointers,Objective C,Memory,Pointers,我是Objective-C新手,必须分配和释放内存。我发现,有时在重新分配指针之前尝试使用[ptr release]时,我会在稍后使用SIGABRT,而如果使用ptr=nil则不会,但我不确定这是否真的会释放指针指向的内容。因此,我想确切地知道ptr=nil做了什么,而不是[ptr release]ptr=nil将使ptr变量具有nil值,并且不会释放指针;因此,它在没有SIGABRT的情况下工作的原因是对象没有被释放 当分配给retain属性时,分配nil也意味着释放release: @pro

我是Objective-C新手,必须分配和释放内存。我发现,有时在重新分配指针之前尝试使用
[ptr release]
时,我会在稍后使用
SIGABRT
,而如果使用
ptr=nil
则不会,但我不确定这是否真的会释放指针指向的内容。因此,我想确切地知道
ptr=nil
做了什么,而不是
[ptr release]
ptr=nil
将使
ptr
变量具有nil值,并且不会释放指针;因此,它在没有SIGABRT的情况下工作的原因是对象没有被释放

当分配给
retain
属性时,分配
nil
也意味着释放
release

@property(nonatomic, retain) .... ptr;
.....
self.ptr = nil;
遵循
release
语句并将赋值为nil是一种很好的做法:

[ptr release];
ptr = nil;
这将防止在发布后不必要地使用解除分配的对象(这对于可以在不同方法中使用的类ivars最有意义)

如果您可以提供一些显示SIGABRT的代码,那么就更容易找到它。

使用:

[ptr release];
实际上,您正在减少
ptr
retainCount
。如果
ptr
retainCount
下降到0,则
ptr
将被释放,内存也将被释放


当您写入
ptr=nil时,您只是在“重置”ptr所指向的内存地址。

这可能是因为您不了解Cocoa的内存管理规则,特别是与对象所有权有关的规则。根据您创建对象的方式,您可以拥有该对象,也可以是其他对象。是否需要释放对象取决于您是否拥有该对象(您要么保留了该对象,要么使用以
alloc
new
copy
mutableCopy
开头的方法创建了该对象)。您可以在中详细阅读有关规则的更多信息

此外,您应该注意有关属性的任何规则。正如sergio所提到的,如果属性指定它保留一个对象,它将在赋值时处理对
retain
release
的调用。例如,如果您使用
alloc
分配某个对象,则您拥有该对象。如果随后将其指定给保留该对象的属性,则您和该属性将保留该对象,因此根据您之后的操作,您可能还希望释放该对象以放弃对该对象的所有权


将简单指针设置为
nil
不会取消分配对象,也不会将其算作
释放
。因此,根据创建对象的方式,您应该知道是否需要释放对象。上面链接的文档包括一些示例,这些示例也可以帮助您快速了解这一点。一个警告:这种东西会随着自动引用计数而改变,因为你不做任何处理
retain
release
,编译器会接管大部分,但是如果你不使用ARC,那就暂时不用担心(以后再担心)。

并编写
ptr=nil代替或在
[ptr发布]之前将导致泄漏。“如果ptr的重新计数降至0,ptr将被释放,内存也将被释放。”--如果我想重用指针指向其他对象,但不再需要它指向的对象,是否有方法取消分配对象而不是指针?只需向对象发送一条
release
消息,然后根据需要重新分配指针变量!假设我有一个保留的类属性:@property(nonatomic,retain)ResultsVC*ResultsVC;然后我分配它:self.resultsVC=[[resultsVC alloc]initWithNibName:@“resultsVC”bundle:nil];我现在需要释放它两次以避免泄漏吗?不,您需要在将其分配给属性后释放它一次。稍后在
dealloc
方法中(或者如果正在释放内存,则在其他位置),您需要将属性设置为
nil
以再次释放它。同样,属性保留了它,当其值更改时(或者更改为
nil
或者其他对象),属性将释放它。