繁体   English   中英

我不知道为什么我得到EXC_BAD_ACCESS(如使用@property保留)

[英]I don't know why I get EXC_BAD_ACCESS ( As Using @property retain )

.h

@ interface MyClass : NSObject {
   UILabel *mTextLabel;
}

@property (nonatomic, retain) UILabel *mTextLabel;

并在MyClass.m中声明@synthesize mTextLabel

然后释放这样的对象。

[self setMTextLabel:nil];
[mTextLabel release];
NSLog (@"%d",[mTextLabel retainCount]);

此结果为0。我没有发现任何错误或中断。

但。 当我像这样发布mTextLabel时。 我刚得到EXC_BAD_ACCESS

[mTextLabel release];
[self setMTextLabel:nil];

我不明白为什么会这样。 请帮我。

当您具有带有keep属性的综合属性时,综合设置器会在设置新值之前在旧的ivar上调用release。

这是第一个示例中发生的情况的展开视图:

[mTextLabel release];
mTextLabel = nil;
[mTextLabel release];

由于在nil指针上调用方法没有任何作用,因此没有问题。

在第二个示例中,正在发生的事情是:

[mTextLabel release];
[mTextLabel release];
mTextLabel =  nil;

看到问题了吗?

编辑:值得注意的是,检查对象的保留计数很少有用,因为任何数量的Cocoa类都可以出于自己的目的保留它。 您只需要确保每次在对象上调用retainalloccopynew时,代码中就会有匹配的releaseautorelease

问题是您正在调用release,然后将属性设置为nil,这还会在将其设置为nil之前将发布发送到mTextLabel 当属性定义为复制或保留时,就会发生这种情况。 您只需要以下代码。

[mTextLabel release];
mTextLabel = nil;

编辑:

我想在init之外的代码中添加它,并进行dealloc调用self.mTextLabel = nil以在必要时正确释放该属性的值,而这完全没问题。 但是,建议不要在init / dealloc调用中使用该属性 在这些情况下,您将需要直接创建/释放对象,以避免访问器的副作用。

当您执行[self setMTextLabel:nil]时,该值已被释放。 您不需要显式地释放该值(除非您使用initcopy方法创建了该值,在这种情况下,应在将其分配给self.mTextLabel立即释放它)。

请注意, retainCount的返回类型为NSUInteger ,因此永远不能为负。 因此检查以确保保留计数为零而不是-1不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM