uilabel在ARC过早地被取消分配

时间:2013-03-29 19:43:03

标签: ios uilabel automatic-ref-counting memory-management

我已经在一个项目上工作了几个星期,最近实现了一个单例对象来协助保存数据。在实现之后,我一直在更新主视图控制器内的标签问题。

例如,我正在尝试更新以下标签:

@property (nonatomic, retain) IBOutlet UILabel *numDrinksLabel;
@property (nonatomic, retain) IBOutlet UILabel *BACLabel;

使用以下代码,该代码位于按下按钮时调用的函数内:

BACLabel.text = [NSString stringWithFormat:@"%.2f", user.BAC];
numDrinksLabel.text = [NSString stringWithFormat:@"(%i)", user.numDrinks];

此代码块给出了运行时错误:

-[__NSCFString setText:]: unrecognized selector sent to instance 0x1197ef40

但是,在viewDidLoadviewDidAppear内调用的相同代码块没有问题。最初,这向我建议我的@property声明存在问题,但是当我将retain更改为strong时,以及当我更改为weak时出现同样的错误,uilabel对象只是null,这是可以预料的,但仍然非常令人沮丧。

所以问题是,为什么在viewDidAppear函数之后标签对象会被解除分配?

非常感谢有关如何解决此问题或进一步测试根本原因的任何建议!

2 个答案:

答案 0 :(得分:0)

请检查这些标签的超级视图是否也已声明为strong

答案 1 :(得分:0)

当您为numDrinksLabel个对象的text属性指定内容时,似乎包含iVars BACLabelUILabel的对象不再存在。
由于在按下按钮后会发生这种情况,因此您之前一直处于主事件循环中。在此循环中,如果某个对象未保留任何自动释放对象,则将释放该对象 因此,在我看来,具有UILabels作为iVars的对象是自动释放对象,并且它不会被保留,因为您不使用像self.BACLabel.text =这样的setter方法,而只是将方法指定为{{1 }}。
因此,尝试像BACLabel.text =这样的设置者替换BACLabel.text =之类的作业,就像第六期所说的那样。