在第二章中,有一个简单的教程,显示两个按钮和一个标签,按下按钮时,标签上会显示按下一个按钮.
我已经完成了教程,但它提出了一个我无法找到答案的问题.
本教程使用ARC(自动引用计数),以防万一.
这是代码,
头文件:
#import <UIKit/UIKit.h> @interface MTMViewController : UIViewController @property (weak,nonatomic) IBOutlet UILabel *statusLabel; - (IBAction)buttonpressed:(UIButton *)sender; @end
和m文件:
#import "MTMViewController.h" @implementation MTMViewController - (IBAction)buttonpressed:(UIButton *)sender { Nsstring *title = [sender titleForState:UIControlStatenormal]; Nsstring *plainText = [Nsstring stringWithFormat:@"%@ button pressed.",title]; statusLabel.text = plainText; } @end
以上就是它在书中出现的情况,但是当在Xcode中进行教程时,我无法使用以下行编译:
statusLabel.text = plainText;
而是必须将其更改为:
_statusLabel.text = plainText;
当我完成这个代码编译并运行良好,我试图找出为什么会发生这种情况,通过回顾教程,看看我是否错过任何东西,但我没有看到任何东西.
任何人都可以解释为什么书中的代码没有编译,为什么我必须在变量的前面添加下划线?这是正确的还是我做错了什么?
解决方法
_statusLabel工作的原因是因为这是保存属性值的基础变量.在以这种方式访问变量时,您正在绕过生成的setter / getter.通常,您应该使用self.propertyName,因为这将尊重您作为属性定义的一部分提供的关键字(一个很好的示例是如果您使用atomic关键字,因为生成的setter和getter将正确放置@synchronized块底层实例变量).
如果您不手动合成属性,Xcode的最新版本会使用前置下划线创建变量名称(这是一件好事,以前人们不得不手动合成).如果您愿意,可以使用@synthesize statusLabel = m_statusLabel定义自己的基础变量名称.这意味着您可以使用m_statusLabel而不是_statusLabel来访问它.除非有迫切需要,否则通常不需要这样做; Apple建议使用前置下划线.
在初始化方法和解除分配方法时应该使用底层变量,因为在代码中此时生成的setter / getter可能不完整.