@property和@synthesize

时间:2012-10-04 15:04:49

标签: objective-c properties synthesis

我对Objective C很新。(现在两天)。当阅读@synthesize时,它似乎与我的理解@property重叠(我认为我明白了)......所以,有些细节需要在我的脑海中消失......这让我烦恼。

如果我对@property@synthesize的差异有误,请纠正我:

如果您在@property中声明了@interface,那么您告诉全世界用户可以使用该属性的标准getter和setter。此外, XCode将为您制作通用的getter和setter。 ...但是, 在@property声明中发生的程度是多少? (I.E.这是否意味着“完全”......就像@interface中看不见的声明,以及@interface中看不见的代码?

-Or -

@property是否仅在@interface中处理看不见的代码声明,而@synthesize会处理@implementation部分中看不见的代码实现? )

3 个答案:

答案 0 :(得分:16)

首先,请注意最新版本的Xcode不再需要@synthesize。你可以(而且应该)省略它。也就是说,这就是作品的作用。

@property是访问者的声明。这只是一个宣言。以下几点之间差别很小:

@property (nonatomic, readwrite, strong) NSString *something;

VS

- (NSString *)something;
- (void)setSomething:(NSString)aSomething;

主要区别在于使用@property声明这些方法可让编译器自动为您生成(综合)实现。您无需让编译器为您执行此操作。您完全可以手动实施somethingsetSomething:,这是常见的。但是,如果你不手动实现它们,编译器将自动为你创建一个名为_something的ivar,并为getter和setter创建一个合理的实现。

在早期版本的Xcode中,您必须使用@synthesize关键字明确请求自动生成。但这不再是必需的。今天,使用@synthesize的唯一原因是,如果您希望ivar具有非标准名称(从不这样做)。

这里的一个关键点是方法somethingsetSomething: 只是方法。他们没有什么神奇之处。它们不是特殊的“财产方法”。它们只是按照惯例访问一个州的方法。这块状态通常存储在一个ivar中,但不一定是。

更清楚:object.something 意味着“从_something返回名为object的ivar。”这意味着“返回[object something]的结果,不管是什么。”通常会返回ivar的值。

您应该使用@property声明声明所有州(内部和外部),并且应该避免直接声明ivars。您还应始终通过其访问者(self.something)访问您的媒体资源,initdealloc方法除外。在initdealloc中,您应该直接使用ivar(_something)。

答案 1 :(得分:7)

@property使用您提供的任何原子性和setter语义在您的类上声明一个属性。

使用Xcode 4.4,可以使用自动合成,其中为您提供了来自您的财产的支持ivar,而没有在@synthesize中声明它。此ivar的格式为_propertyName,其中您的媒体资源名称为propertyName

答案 2 :(得分:0)

Objective-C @property 和 @synthesize

@property

  • 生成获取/设置方法
  • 今天(来自 Xcode v4.4 和 LLVM v4.0)@property 在内部还使用了 @synthesize
    • @synthesize propertyName = _propertyName

@synthesize

  • 生成新的 iVar 或与现有 iVar 的链接
  • 使用适当的 iVar 生成 get/set 方法的实现

[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