Don*_*rty 7 cocoa-touch objective-c ios automatic-ref-counting ios6
我开始学习如何在一分钟内开发一些iOS,而我目前正在开始使用我正在开发的IOS6书.
在第二章中,有一个简单的教程,显示两个按钮和一个标签,按下按钮时,标签上会显示按下一个按钮.
我已经完成了教程,但它提出了一个我无法找到答案的问题.
本教程使用ARC(自动引用计数),以防万一.
这是代码,
头文件:
#import <UIKit/UIKit.h>
@interface MTMViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
- (IBAction)buttonPressed:(UIButton *)sender;
@end
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
以上是它出现在书中的方式,但是当在Xcode中进行教程时,我无法使用以下行编译:
statusLabel.text = plainText;
Run Code Online (Sandbox Code Playgroud)
而不得不改为:
_statusLabel.text = plainText;
Run Code Online (Sandbox Code Playgroud)
当我完成这个代码编译并运行良好,我试图找出为什么发生这种情况,通过回顾教程,看看我错过了什么,但我没有看到任何东西.
任何人都可以解释为什么书中的代码没有编译,为什么我必须在变量的前面添加下划线?这是正确的还是我做错了什么?
WDU*_*DUK 11
statusLabel.text = plainText;失败的原因是因为您没有正确访问该属性.为了通过生成的getter/setter访问它,你需要预先self.添加它,因为属性(及其setter/getters)属于self的实例.相反,它会self.statusLabel.text = plainText;
之所以_statusLabel有效,是因为这是保存属性值的基础变量.在以这种方式访问变量时,您正在绕过生成的setter/getter.通常,您应该使用self.propertyName,因为这将尊重您作为属性定义的一部分提供的关键字(一个很好的示例是如果您使用atomic关键字,因为生成的setter和getter将正确地@synchronized在基础实例变量周围放置一个块).
如果您不手动合成属性,Xcode的最新版本会使用前置下划线创建变量名称(这是一件好事,以前人们不得不手动合成).如果您愿意,可以使用定义自己的基础变量名称@synthesize statusLabel = m_statusLabel.这意味着您可以使用m_statusLabel而不是使用它来访问它_statusLabel.除非有迫切的需要,否则通常不需要这样做; Apple建议使用前置下划线.
在初始化方法和解除分配方法时应该使用底层变量,因为在代码中此时生成的setter/getter可能不完整.
| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |