Objective-c 在什么情况下@synthesize 是自动的?
也许在使用 LLVM 3.0 及更高版本时?从网上阅读看来,从 Xcode 4 开始似乎@synthesize
没有必要。但是,我正在使用 Xcode 4 并在我没有@synthesize
属性时收到警告。
对为什么不自动合成属性的一些回应似乎暗示在某些情况下可以在某些时候省略@synthesize。
另一个(旧的)参考提示@synthesize
可能在将来的某个时候自动出现。
Objective-c 在什么情况下@synthesize 是自动的?
也许在使用 LLVM 3.0 及更高版本时?从网上阅读看来,从 Xcode 4 开始似乎@synthesize
没有必要。但是,我正在使用 Xcode 4 并在我没有@synthesize
属性时收到警告。
对为什么不自动合成属性的一些回应似乎暗示在某些情况下可以在某些时候省略@synthesize。
另一个(旧的)参考提示@synthesize
可能在将来的某个时候自动出现。
从 clang 3.2(大约 2012 年 2 月)开始,默认提供 Objective-C 属性的“默认合成”(或“自动属性合成”)。它基本上如您最初阅读的博客文章中所述:http ://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (除了该帖子将该功能描述为“启用,然后禁用";我不知道这是否是 Xcode 的问题,或者 clang 开发人员自己是否在这个问题上来回反复)。
据我所知,在clang 3.2中属性不会被默认合成的唯一情况是这些属性是从协议继承的。这是一个例子:
#import <Foundation/Foundation.h>
@protocol P
@property int finicky;
@end
@interface A : NSObject <P>
@property int easygoing;
@end
@implementation A
@end
int main() { A *a = [A new]; a.easygoing = 0; a.finicky = 1; }
如果你编译这个例子,你会得到一个警告:
test.m:11:17: warning: auto property synthesis will not synthesize property
declared in a protocol [-Wobjc-protocol-property-synthesis]
@implementation A
^
test.m:4:15: note: property declared here
@property int finicky;
^
1 warning generated.
如果你运行它,你会从运行时得到一个错误:
objc[45820]: A: Does not recognize selector forward:: (while forwarding setFinicky:)
Illegal instruction: 4
从 Xcode 4.4 开始,如果您不编写@synthesize
或@dynamic
用于属性。编译器的行为就像您编写了@synthesize property = _property
.
在 Xcode 4.4 之前,您必须对每个属性执行以下操作之一,否则编译器将发出警告并且您将收到运行时错误。在 Xcode 4.4 或更高版本中,您可以执行以下任何操作,而不是让编译器自动合成属性访问器和实例变量。
@synthesize
指令。@dynamic
指令并以某种方式在运行时提供属性 getter 和(如有必要)setter。readwrite
,则编写属性 setter 方法。请注意,您可以使用@synthesize
指令(或@dynamic
指令),也可以显式提供 getter 和/或 setter 方法。但是@synthesize
,如果您省略它们,则会提供它们。
来自Xcode 4.4文档中的新功能:
Objective-C @properties 在未显式实现时默认合成。
所以@synthesize 从 Xcode 4.4 和 LLVM 4.0 编译器开始默认是自动的。
此外,如果您手动实现了 setter 和 getter,则合成不会自动进行。因此,如果您想知道为什么在声明 @property (...) SomeType someVariable 后无法访问 _someVariable,那是因为您已经实现了 setSomeVariable: 和 someVariable 方法。
您可以通过单击左侧 Project Navigator 中的项目名称然后单击 Build Settings 中的 All Cobined 然后搜索 synthesize 来关闭合成警告。那应该设置为否。