对于下面的代码,如果我通过“self”将指标弄清楚,如果不使用self而不是崩溃,它会崩溃。 不是我应该总是使用“self”来访问由@property创建和保留的ivars的规则吗?
@property(nonatomic,retain) UIActivityIndicatorView* activityIndicator;
if(activityIndicator!=nil){
[activityIndicator removeFromSuperview];
//self.activityIndicator = nil; //crashes!
activityIndicator = nil; //does not crash
}
答案 0 :(得分:3)
一般来说:
self.activityIndicator = nil; //crashes!
将release
activityIndicator,因此这可能与崩溃有关。
activityIndicator = nil; //does not crash
不会释放活动指示器,你没有崩溃,你有内存泄漏。
在具体案例中,崩溃可能取决于执行此操作时的事实:
[activityIndicator removeFromSuperview];
活动指标已经发布;现在,如果还发生了retain count变为0,那么该对象也会被释放,但该属性不会更新以反映该对象已被释放的事实。因此,当你将它设置为nil时,setter会尝试释放它,但是obejct不再存在,因此崩溃。
这是猜测。如果您在班级中正确保留了活动指示器,则不应该发生这种情况。因此,您要么查看创建活动指示符的代码以及代码中使用activityIndicator
的位置,要么发布它以获得更多帮助......