Xcode 4.5 似乎仍然期待@synthesize - 否则无法访问属性

Posted

技术标签:

【中文标题】Xcode 4.5 似乎仍然期待@synthesize - 否则无法访问属性【英文标题】:Xcode 4.5 still seems to be expecting @synthesize - else cannot access property 【发布时间】:2012-11-04 08:55:28 【问题描述】:

我在全新安装的 Mountain Lion 上使用 Xcode 4.5。编译器是 LLVM4.1,我的项目使用的是 ARC。 (我过去曾涉足过 Xcode,但有一段时间没有接触过它。

我的问题:

我知道在较新版本的 Xcode 中不再需要包含 @synthesize 指令(果然,当我从 .xib 中的 UI 组件 ctrl-drag 到 .h 文件时,指令不会在 .m 文件中创建),但没有它们我无法访问这些属性,而是得到“未知接收器 xxx”错误。

简单示例:

我创建了一个带有标签 ('myLabel') 和按钮 ('myButton') 的 Single View iPhone 项目。我从 ViewController.xib 中的 UILabel ctrl-拖动到 ViewController.h 以创建以下属性:

@property (strong, nonatomic) IBOutlet UILabel *myLabel;

我也通过拖放创建了按钮动作

在 .m 文件中,我在 myButton 方法中编写了以下代码:

- (IBAction)myButton:(id)sender 
  NSLog(@"The label text is %@", [myLabel text]);

结果:

这给了我一个编译时错误(“Unknown receiver myLabel”)。

我仍然可以使用下划线(即 [_myLabel 文本])或添加“@synthesize myLabel;”来访问我的属性手动在 .m 文件的顶部,但我认为我不需要这样做,或者应该为我完成。谁能解释我在代码中做错了什么(或者如果这是由于我需要调整的某些设置?)

谢谢

附言我注意到我的 .m 文件现在在顶部也有自己的 @interface 块(大概是为了声明私有变量?)

【问题讨论】:

【参考方案1】:

自动 ivars 带有下划线前缀,以将它们与属性名称区分开来。所以你需要使用_myLabel。如果您不喜欢默认前缀,可以使用 @synthesize 更改属性的 ivar 名称

【讨论】:

谢谢,所以使用 _myLabel 很好,并且是一种公认​​的工作方式? (不建议使用合成的 getter/setter?)我最初问题的原因是我正在观看使用 4.3 的视频教程(lynda.com),并且在构建上述方法时自动创建了合成。该视频随后提到,在 XCode 4.5 中,用户甚至不需要编写合成,因为它是在后台为您完成的 - 但事实似乎并非如此。

以上是关于Xcode 4.5 似乎仍然期待@synthesize - 否则无法访问属性的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 4.5 - 崩溃日志未符号化

xcode 4.5 上的符号化崩溃失败

并排安装 xcode 4.4 和 xcode 4.5?

facebook SDK3.1 和 Xcode 4.5 链接器错误

Xcode 4.5 的临时安装失败

如何在 Xcode 4.5 中添加旧版本的 iOS SDK