在什么情况下是在Objective-C @synthesize自动?
或许,当使用LLVM 3.0和最多? 来自各地的净读书好像@synthesize
是不必要的和Xcode 4开始不过我使用的Xcode 4和接收警告,当我不@synthesize
的属性。
一些响应的为什么不性质得到自动合成似乎意味着@synthesize可以在某些情况下某些时候被省略。
另一个(旧)参考暗示@synthesize
可能会自动在未来的某一时刻。
在什么情况下是在Objective-C @synthesize自动?
或许,当使用LLVM 3.0和最多? 来自各地的净读书好像@synthesize
是不必要的和Xcode 4开始不过我使用的Xcode 4和接收警告,当我不@synthesize
的属性。
一些响应的为什么不性质得到自动合成似乎意味着@synthesize可以在某些情况下某些时候被省略。
另一个(旧)参考暗示@synthesize
可能会自动在未来的某一时刻。
作为铛3.2(大约2012年2月),“默认合成” Objective-C的特性(或“自动合成属性”)由缺省设置。 它本质上是在您最初阅读博客文章中描述: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (除了该职位描述为“已启用,然后禁用该功能“我不知道这是一个问题,在Xcode或如果铛开发商自己已经来回走了关于这个问题)。
据我所知,只有情况,其中性能不会当这些属性已经从协议继承是默认合成在铛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的新功能的文档:
Objective-C的@properties默认情况下,合成的时候没有明确落实。
所以@synthesize默认情况下在Xcode 4.4与4.0 LLVM编译器开机自动。
由于的Xcode 4.4的,如果你不写@synthesize
或@dynamic
一个属性。 编译器的作用,就像你写@synthesize property = _property
。
Xcode的4.4之前,你必须做下面的事情之一每个属性,否则编译器会发出警告,你会得到一个运行时错误。 在Xcode 4.4或更高版本,可以做任何的以下的事情,而不是让编译器会自动合成属性访问和实例变量。
@synthesize
指令。 @dynamic
指令,并以某种方式在运行时提供属性getter和(如有必要)的制定者。 readwrite
,属性setter方法。 请注意,您可以使用@synthesize
指令(或@dynamic
指令), 也明确地提供getter和/或setter方法。 但是@synthesize
提供他们,如果你忽略他们。
此外,合成,如果你已经实现了setter和手动吸气剂不会是自动的。 所以,如果你想知道为什么你不能访问_someVariable,其申报@property(...)SOMETYPE someVariable,那是因为你已经实现了setSomeVariable:和someVariable方法。
您可以通过点击项目名称在Project Navigator左侧然后单击生成设置所有Cobined然后搜索综合关掉合成警告。 这应该被设置为No.