[英]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类都可以出于自己的目的保留它。 您只需要确保每次在对象上调用retain
, alloc
, copy
或new
时,代码中就会有匹配的release
或autorelease
。
问题是您正在调用release,然后将属性设置为nil,这还会在将其设置为nil之前将发布发送到mTextLabel
。 当属性定义为复制或保留时,就会发生这种情况。 您只需要以下代码。
[mTextLabel release];
mTextLabel = nil;
编辑:
我想在init之外的代码中添加它,并进行dealloc调用self.mTextLabel = nil
以在必要时正确释放该属性的值,而这完全没问题。 但是,建议不要在init / dealloc调用中使用该属性 。 在这些情况下,您将需要直接创建/释放对象,以避免访问器的副作用。
当您执行[self setMTextLabel:nil]
时,该值已被释放。 您不需要显式地释放该值(除非您使用init
或copy
方法创建了该值,在这种情况下,应在将其分配给self.mTextLabel
立即释放它)。
请注意, retainCount
的返回类型为NSUInteger
,因此永远不能为负。 因此检查以确保保留计数为零而不是-1不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.