我对Objective C很新。(现在两天)。当阅读@synthesize
时,它似乎与我的理解@property
重叠(我认为我明白了)......所以,有些细节需要在我的脑海中消失......这让我烦恼。
如果我对@property
和@synthesize
的差异有误,请纠正我:
如果您在@property
中声明了@interface
,那么您告诉全世界用户可以使用该属性的标准getter和setter。此外, XCode将为您制作通用的getter和setter。 ...但是, 在@property声明中发生的程度是多少? (I.E.这是否意味着“完全”......就像@interface
中看不见的声明,以及@interface
中看不见的代码?
-Or -
@property
是否仅在@interface
中处理看不见的代码声明,而@synthesize
会处理@implementation
部分中看不见的代码实现? )
答案 0 :(得分:16)
首先,请注意最新版本的Xcode不再需要@synthesize。你可以(而且应该)省略它。也就是说,这就是作品的作用。
@property
是访问者的声明。这只是一个宣言。以下几点之间差别很小:
@property (nonatomic, readwrite, strong) NSString *something;
VS
- (NSString *)something;
- (void)setSomething:(NSString)aSomething;
主要区别在于使用@property
声明这些方法可让编译器自动为您生成(综合)实现。您无需让编译器为您执行此操作。您完全可以手动实施something
和setSomething:
,这是常见的。但是,如果你不手动实现它们,编译器将自动为你创建一个名为_something
的ivar,并为getter和setter创建一个合理的实现。
在早期版本的Xcode中,您必须使用@synthesize
关键字明确请求自动生成。但这不再是必需的。今天,使用@synthesize
的唯一原因是,如果您希望ivar具有非标准名称(从不这样做)。
这里的一个关键点是方法something
和setSomething:
只是方法。他们没有什么神奇之处。它们不是特殊的“财产方法”。它们只是按照惯例访问一个州的方法。这块状态通常存储在一个ivar中,但不一定是。
更清楚:object.something
不意味着“从_something
返回名为object
的ivar。”这意味着“返回[object something]
的结果,不管是什么。”通常会返回ivar的值。
您应该使用@property
声明声明所有州(内部和外部),并且应该避免直接声明ivars。您还应始终通过其访问者(self.something
)访问您的媒体资源,init
和dealloc
方法除外。在init
和dealloc
中,您应该直接使用ivar(_something
)。
答案 1 :(得分:7)
@property
使用您提供的任何原子性和setter语义在您的类上声明一个属性。
使用Xcode 4.4,可以使用自动合成,其中为您提供了来自您的财产的支持ivar,而没有在@synthesize
中声明它。此ivar的格式为_propertyName
,其中您的媒体资源名称为propertyName
。
答案 2 :(得分:0)
Objective-C @property 和 @synthesize
@property
@property
在内部还使用了 @synthesize
@synthesize
:
[Case when @synthesize can be used]
@property
@interface SomeClass : NSObject
@property NSString *foo;
@end
//generated code
@interface SomeClass : NSObject
- (NSString *)foo;
- (void)setFoo:(NSString)newFoo;
@end
@synthesize
模式
@synthesize <property_name> = <variable_name>;
//Using
//1. Specify a variable. New variable(variableName) will be generated/linked with existing
@synthesize propertyName = variableName
//if variableName is not exist it generates:
//NSString *variableName;
//read access
NSString *temp = variableName;
//2. Default. New variable(propertyName - the same name as a property) will be generated/linked with existing
@synthesize propertyName
//is the same as
//@synthesize propertyName = propertyName
//if propertyName is not exist it generates:
//NSString *propertyName;
//read access
NSString *temp = propertyName;
//if you specify not-existing <property_name> you get
//Property implementation must have its declaration in interface '<class_name>' or one of its extensions
以前你必须使用下一个语法:
@interface SomeClass : NSObject
{
//1. declare variable
NSString *_foo;
}
//2. create property
@property NSString *foo;
@end
@implementation SomeClass
//3. link property and iVar
@synthesize foo = _foo;
@end
但今天你可以使用下一个语法
@interface SomeClass : NSObject
//1. create property
@property NSString *foo;
@end
接下来,将为两种情况生成相同的代码
@interface SomeClass : NSObject
{
//variable
NSString *_foo;
}
//getter/setter
- (void)setFoo:(NSString *)newFoo;
- (NSString *)foo;
@end
@implementation SomeClass
- (void)setFoo:(NSString *)newFoo
{
_foo = newFoo;
}
- (NSString *)foo
{
return _foo;
}
@end