为什么要使用@synthesize 语句
Why use @synthesize statements
当我第一次学习 iOS 编程时(我相信这是来自斯坦福大学 ARC 之前的讲座),我们总是综合这样的属性:
@synthesize myProperty=_myProperty
但是,这似乎已经 default behaviour 有一段时间了。因此,省略此语句与保留它完全相同。
我的问题是:鉴于此默认行为,有哪些实际示例我们实际上想在其中使用@synthesize 语句?
您不必使用它。
只需在 .h 中像这样声明 public 属性:
@property (nonatomic, strong/weak/assign) MyType *propertyName;
关于 ARC 的更多详细信息here
补充说明:
@synthesize
用于 link 带有内部 class 变量的 属性。使用 ARC 自动完成。
@synthesize in objective-c 只是实现了 属性 setters 和 getters:
- (void)setCoolWord:(NSString *)coolWord {
_coolWord = coolWord;
}
- (NSString *)coolWord {
return _coolWord;
}
Xcode 4 确实为您实现了这一点(iOS6 需要 Xcode 4)。从技术上讲,它实现了@synthesize coolWord = _coolWord(_coolWord 是实例变量,coolWord 是 属性)。
要访问这些属性,请使用 self.coolWord 两者都用于设置 self.coolWord = @"YEAH!";并获得 NSLog(@"%@", self.coolWord);
另请注意,setter 和 getter 仍然可以手动实施。如果您同时实施 setter 和 getter,尽管您还需要手动包含 @synthesize coolWord = _coolWord;
通过 iOS6 中的自动合成,不再需要专门声明支持 ivars 或编写 @synthesize 语句。当编译器找到 @属性 语句时,它将使用我们刚刚回顾的指南代表我们完成这两项工作。 所以我们需要做的就是像这样声明一个 属性 :
@property (nonatomic, strong) NSString *abc;
而在iOS6中,@synthesize abc = _abc,会在编译时自动加上。
对于 iOS 6,LLVM 编译器附带了一个叫做 "property autosynthesis" 的东西。基本上,这意味着编译器会为它看到的每个 @property
添加一个 @synthesize
,格式如下:
@synthesize propertyName = _propertyName;
也就是说,它将创建一个带有下划线前缀的ivar,并使用这个ivar生成getter & setter。
明确使用 @synthesize
的原因只有一个,原因是重命名 ivar,或者,例如,为两个不同的属性使用相同的 ivar。
另请注意,在某些情况下您需要使用@dynamic
来防止合成。通常当您知道方法(getter 或 setter)已经在某处定义但编译器不知道它们时。
自动合成没有内存影响,因此它根本没有连接到 ARC。
What if I manually implement getter and a setter?
如果 属性 是可读写的并且您实现了 setter 和 getter,或者如果 属性 是只读的并且您实现了 getter,那么什么都不会合成。综合指的是两种方法的自动定义。为什么编译器要合成已经存在的东西?如果手动实现需要一个ivar,只需声明ivar,你不需要添加@synthesize
只是为了添加一个ivar(尽管你可以)。
编辑
我忘记了一个需要使用 @synthesize
的原因,那就是在实现协议中声明的 属性 时。这样的 属性 不会被自动合成。一个典型的例子是[UIApplicationDelegate window]
.
当我第一次学习 iOS 编程时(我相信这是来自斯坦福大学 ARC 之前的讲座),我们总是综合这样的属性:
@synthesize myProperty=_myProperty
但是,这似乎已经 default behaviour 有一段时间了。因此,省略此语句与保留它完全相同。
我的问题是:鉴于此默认行为,有哪些实际示例我们实际上想在其中使用@synthesize 语句?
您不必使用它。 只需在 .h 中像这样声明 public 属性:
@property (nonatomic, strong/weak/assign) MyType *propertyName;
关于 ARC 的更多详细信息here
补充说明:
@synthesize
用于 link 带有内部 class 变量的 属性。使用 ARC 自动完成。
@synthesize in objective-c 只是实现了 属性 setters 和 getters:
- (void)setCoolWord:(NSString *)coolWord {
_coolWord = coolWord;
}
- (NSString *)coolWord {
return _coolWord;
}
Xcode 4 确实为您实现了这一点(iOS6 需要 Xcode 4)。从技术上讲,它实现了@synthesize coolWord = _coolWord(_coolWord 是实例变量,coolWord 是 属性)。
要访问这些属性,请使用 self.coolWord 两者都用于设置 self.coolWord = @"YEAH!";并获得 NSLog(@"%@", self.coolWord);
另请注意,setter 和 getter 仍然可以手动实施。如果您同时实施 setter 和 getter,尽管您还需要手动包含 @synthesize coolWord = _coolWord;
通过 iOS6 中的自动合成,不再需要专门声明支持 ivars 或编写 @synthesize 语句。当编译器找到 @属性 语句时,它将使用我们刚刚回顾的指南代表我们完成这两项工作。 所以我们需要做的就是像这样声明一个 属性 :
@property (nonatomic, strong) NSString *abc;
而在iOS6中,@synthesize abc = _abc,会在编译时自动加上。
对于 iOS 6,LLVM 编译器附带了一个叫做 "property autosynthesis" 的东西。基本上,这意味着编译器会为它看到的每个 @property
添加一个 @synthesize
,格式如下:
@synthesize propertyName = _propertyName;
也就是说,它将创建一个带有下划线前缀的ivar,并使用这个ivar生成getter & setter。
明确使用 @synthesize
的原因只有一个,原因是重命名 ivar,或者,例如,为两个不同的属性使用相同的 ivar。
另请注意,在某些情况下您需要使用@dynamic
来防止合成。通常当您知道方法(getter 或 setter)已经在某处定义但编译器不知道它们时。
自动合成没有内存影响,因此它根本没有连接到 ARC。
What if I manually implement getter and a setter?
如果 属性 是可读写的并且您实现了 setter 和 getter,或者如果 属性 是只读的并且您实现了 getter,那么什么都不会合成。综合指的是两种方法的自动定义。为什么编译器要合成已经存在的东西?如果手动实现需要一个ivar,只需声明ivar,你不需要添加@synthesize
只是为了添加一个ivar(尽管你可以)。
编辑
我忘记了一个需要使用 @synthesize
的原因,那就是在实现协议中声明的 属性 时。这样的 属性 不会被自动合成。一个典型的例子是[UIApplicationDelegate window]
.