是" @合成"每一个" @ property"必要?

时间:2014-08-24 06:17:15

标签: objective-c

我正在关注Ray Wenderlich(Scarybugs part 1)的iOS教程之一。但我注意到模型中的每个属性,他总是" @ synthesize"它在实施中。

以下是模型的示例:

#import <Foundation/Foundation.h>

@interface RWTScaryBugData : NSObject

@property (strong) NSString *title;
@property (assign) float rating;

- (id)initWithTitle:(NSString*)title rating:(float)rating;

@end

-

#import "RWTScaryBugData.h"

@implementation RWTScaryBugData

@synthesize title = _title;
@synthesize rating = _rating;

- (id)initWithTitle:(NSString*)title rating:(float)rating {
  if ((self = [super init])) {
    self.title = title;
    self.rating = rating;
  }
  return self;
}

@end

-

#import <Foundation/Foundation.h>

@class RWTScaryBugData;

@interface RWTScaryBugDoc : NSObject

@property (strong) RWTScaryBugData *data;
@property (strong) UIImage *thumbImage;
@property (strong) UIImage *fullImage;

- (id)initWithTitle:(NSString*)title rating:(float)rating thumbImage:(UIImage *)thumbImage fullImage:(UIImage *)fullImage;

@end

-

#import "RWTScaryBugDoc.h"
#import "RWTScaryBugData.h"

@implementation RWTScaryBugDoc
@synthesize data = _data;
@synthesize thumbImage = _thumbImage;
@synthesize fullImage = _fullImage;

- (id)initWithTitle:(NSString*)title rating:(float)rating thumbImage:(UIImage *)thumbImage fullImage:(UIImage *)fullImage {  
  if ((self = [super init])) {
    self.data = [[RWTScaryBugData alloc] initWithTitle:title rating:rating];
    self.thumbImage = thumbImage;
    self.fullImage = fullImage;
  }
  return self;
}

@end

我知道&#34; @ synthesize&#34;基本上是为一个属性分配一个实例变量,但默认情况下它已经为每个&#34; @ property&#34; in&#34; .h文件&#34; (虽然不可见)。

我的问题是:是否需要&#34; @ synthesize&#34;每一个&#34; @ property&#34;我们有公共API吗? (我尝试删除所有&#34; @ synthesize&#34;在实现中,它仍然有效)

3 个答案:

答案 0 :(得分:4)

不再需要

@synthesize。编译器将根据需要合成getter和setter,并自动将名为_<propertyName>的实例变量合成。它创建了实例变量,但更重要的是它创建了getter和setter方法(用于readwrite属性)。

如果您手动为属性提供了getter / setter,则实例变量不会自动合成,您需要添加@synthesize语句。来自docs

  

注意:编译器会在所有情况下自动合成一个实例变量,它也会合成至少一个存取方法。如果为readwrite属性实现getter和setter,或者为readonly属性实现getter,编译器将假定您正在控制属性实现,并且不会自动合成实例变量。   如果您仍然需要一个实例变量,则需要请求合成一个:   @synthesize property = _property;

答案 1 :(得分:1)

Objective-C Feature Availability Index所述,Xcode 4.4(LLVM编译器4.0)引入了属性实例变量的自动合成,并且需要现代运行时(iOS上的所有代码,OS X上的64位代码)。 / p>

所以,教程有点过时了,这就是全部。

答案 2 :(得分:0)

希望这会有所帮助。

@property(nonatomic)NSString * name;

@property是一个Objective-C指令,它声明了属性

-> The "`nonatomic`" in the parenthesis specifies that the property is non-atomic in nature.
-> and then we define the type and name  of our property.
-> prototyping of getter and setter method

现在转到.m文件

之前我们使用@synthesis合成此属性,现在它还需要 NOT ,它由IDE自动完成。

- &GT;这个@synthesis现在生成getter和setter(如果不是readonly)方法。

然后为什么我们甚至在代码中写@synthesis,如果它总是由IDE完成。

其中一个基本用途是: -

我们的IDE在内部做什么

@synthesis name=_name;

我们使用_name来访问特定属性,但现在你想通过其他方式进行综合 firstname你可以像

那样做
@synthesis name= firstname

或仅按名称

@synthesis name=name

因此,您可以根据需要访问此属性。