在什么条件下,在Objective-c中自动@synthesize?
也许在使用LLVM 3.0及更高版本时?从网上阅读看起来似乎{X} 4开始不需要@synthesize
。但是当我没有@synthesize
属性时,我正在使用Xcode 4并收到警告。
对Why don't properties get automatically synthesized的一些回复似乎暗示@synthesize在某些情况下可以在某些情况下被省略。
Another (old) reference暗示@synthesize
可能会在将来某个时候自动生效。
答案 0 :(得分:24)
截至第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
答案 1 :(得分:13)
从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
会提供它们。
答案 2 :(得分:13)
来自New Features in Xcode 4.4文件:
Objective-C @properties在未明确实现时默认合成。
所以@synthesize默认是自动从Xcode 4.4开始使用LLVM 4.0编译器。
答案 3 :(得分:9)
此外,如果您手动实现了setter AND getter,则synthesize将不会自动生成。所以如果你想知道为什么你不能访问_someVariable,声明@property(...)SomeType someVariable,那是因为你已经实现了setSomeVariable:和someVariable方法。
答案 4 :(得分:5)
您可以通过单击左侧Project Navigator中的项目名称关闭合成警告,然后单击Build Settings中的All Cobined,然后搜索合成。那应该设置为No。