在什么情况下是在Objective-C @synthesize自动?在什么情况下是在Objectiv

2019-05-11 21:20发布

在什么情况下是在Objective-C @synthesize自动?

或许,当使用LLVM 3.0和最多? 来自各地的净读书好像@synthesize是不必要的和Xcode 4开始不过我使用的Xcode 4和接收警告,当我不@synthesize的属性。

一些响应的为什么不性质得到自动合成似乎意味着@synthesize可以在某些情况下某些时候被省略。

另一个(旧)参考暗示@synthesize可能会自动在未来的某一时刻。

Answer 1:

作为铛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


Answer 2:

从在Xcode 4.4的新功能的文档:

Objective-C的@properties默认情况下,合成的时候没有明确落实。

所以@synthesize默认情况下在Xcode 4.4与4.0 LLVM编译器开机自动。



Answer 3:

由于的Xcode 4.4的,如果你不写@synthesize@dynamic一个属性。 编译器的作用,就像你写@synthesize property = _property

Xcode的4.4之前,你必须做下面的事情之一每个属性,否则编译器会发出警告,你会得到一个运行时错误。 在Xcode 4.4或更高版本,可以做任何的以下的事情,而不是让编译器会自动合成属性访问和实例变量。

  1. 使用@synthesize指令。
  2. 使用@dynamic指令,并以某种方式在运行时提供属性getter和(如有必要)的制定者。
  3. 明确写入属性getter方法,如果属性是readwrite ,属性setter方法。

请注意,您可以使用@synthesize指令(或@dynamic指令), 明确地提供getter和/或setter方法。 但是@synthesize提供他们,如果你忽略他们。



Answer 4:

此外,合成,如果你已经实现了setter和手动吸气剂不会是自动的。 所以,如果你想知道为什么你不能访问_someVariable,其申报@property(...)SOMETYPE someVariable,那是因为你已经实现了setSomeVariable:和someVariable方法。



Answer 5:

您可以通过点击项目名称在Project Navigator左侧然后单击生成设置所有Cobined然后搜索综合关掉合成警告。 这应该被设置为No.



文章来源: Under what conditions is @synthesize automatic in Objective-c?