我正在关注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;在实现中,它仍然有效)
答案 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
因此,您可以根据需要访问此属性。