澄清何时在分配后释放指针

ari*_*rio 2 memory-management objective-c retain

在我的上一个问题(这里),我有一个问题,我得到一个EXC_BAD_ACCESS,因为我发布了我刚刚分配的变量:

NSMutableArray* s = [[NSMutableArray alloc] init];
stack = s;
[s release];
Run Code Online (Sandbox Code Playgroud)

本来应该

NSMutableArray* s = [[NSMutableArray alloc] init];
stack = s;
Run Code Online (Sandbox Code Playgroud)

但是,stack是我的类的保留属性.它的声明如下:

@interface StateStack ()
@property (nonatomic, retain) NSMutableArray* stack;
@end
Run Code Online (Sandbox Code Playgroud)

我的印象是,当您指定'retain'变量时,它会自动增加对象的retainCount.所以你应该从释放指针开始(如此处所示).

为什么这两种情况不同?谢谢!

Mau*_*res 6

因为您必须分配属性,而不是实例变量.当您分配给该属性时,它将再次保留该变量,然后您将不会遇到该问题.以下是您的代码应该如何:

NSMutableArray* s = [[NSMutableArray alloc] init];
self.stack = s;
[s release];
Run Code Online (Sandbox Code Playgroud)

这样你就不会分配给变量,而是使用属性(实际上是一个方法).如果在这种情况下没有释放,那么代码中就会出现内存泄漏.

当你执行stack = s时,你直接分配给实例变量,并且从不保留数组.