现代Objective-C(2013)并声明ivars /使用@property,@ dynamic和@synthesize

bar*_*dog 3 oop objective-c instance-variables

使用当前版本的Objective-C,用于声明ivars的官方标准和最佳实践是什么,使用@property@synthesize?关于这个主题有很多帖子和资源,但大多数帖子和资源在一两年前相当陈旧.我最近学会了在类的实现中只在声明块中声明ivars,以便OOP的封装原则不被破坏,但是在这个时代甚至需要声明ivars?在做什么可能的用例:

@interface MyClass()
@property (nonatomic) NSString* data;
@end

@implementation MyClass{
    @private
        NSString* _data;
}
@end
Run Code Online (Sandbox Code Playgroud)

有必要的?为了进一步说明,是否有必要使用@synthesize?我的理解是使用@property将自动合成访问器方法以及支持ivars.我做了一些实验,我注意到当我没有NSString* _data', I can still access在我的类实现中声明_data'时.这是否意味着宣称伊娃将归结为一种风格问题,这取决于程序员的自由裁量权?我可以压缩我的代码并删除我的实现中的语句块中的所有ivar声明,并@property在我的私有界面中使用吗?如果不是这样,那么明确宣布伊娃的优点和缺点是什么?

最后,@dynamic.从我可以收集到的,它曾经对编译器说,"嘿编译器,不要自动生成访问器方法,如果你没有找到它的实现,不要担心,我会在运行时提供一个".这一切@dynamic都用于或者还有更多吗?

我只是想澄清所有这些事情,因为它似乎有很多不同的意见,而且没有必要一个正确的答案.此外,随着Objective-C的发展和进步,这些答案将会发生变化,因此有一个简明扼要的最新指南会很好.感谢大家!(如果有什么我可以说得更好或更清楚,请告诉我)

编辑:

总之,我问的是这个:

1)宣布具有现代Objective-C的伊娃需要吗?2)我可以通过使用来实现声明ivars和相应属性的相同效果@property吗?3)@dynamic用于什么?4)我可以完全放弃使用@synthesize或是否有一个好的用例?

在您认为合适的情况下进行投票和投票.

And*_*sen 6

这里有很多要回答的问题.我会把它分解:

宣布伊娃

正如您已经正确指出的那样,编译器的现代版本将为声明的@properties合成后备实例变量.例外情况是在32位Mac上,现有的Objective-C运行时(包括非脆弱的实例变量)不可用.假设您的应用程序不是针对32位OS X,您不需要显式声明支持ivar @property.

如果你仍然想直接使用ivar,没有相应的@property(我认为大多数时候我认为是个坏主意),你当然必须明确声明ivar.

@动态

@dynamic正如你所说的那样,是为了告诉编译器"不要为这个属性合成访问器,我会在运行时自己做".它并没有经常使用.它使用的一个地方是NSManagedObject子类,如果你在头文件中声明一个建模属性,你不希望编译器抱怨没有为该属性实现访问器,也不希望它自己生成访问器.NSManagedObject在运行时为模型属性生成访问器.自定义CALayer子类的故事类似.

@合成

@synthesize显式告诉编译器合成访问器方法,并且(在iOS和64位Mac上)指定属性的相应ivar.有三种主要情况仍需要使用它:

  1. 32位Mac应用程序.
  2. 如果你已经编写了自己的自定义setter和getter(或者只是getterly属性的getter).在这种情况下,编译器不会合成访问器,因为它会看到你的访问器.但是,它也不会合成背面ivar.所以,你必须使用@synthesize someProperty = _someProperty;,告诉编译器合成一个ivar.当然,它仍然不会合成存取方法.或者,您可以明确声明支持ivar.我赞成@synthesize在这种情况下使用.
  3. 如果要为属性的支持ivar使用与默认名称不同的名称(具有添加的下划线前缀的属性名称).这很少见.我可以想到使用它的主要情况是在转换现有的旧代码时,包括直接ivar访问以及ivars不以下划线为前缀.