iOS @property和@synthesize和@dynamic关键字

1,907 阅读2分钟
  • 前言

    iOS 6 之后 LLVM 编译器引入property autosynthesis,即属性自动合成,就很少使用synthesize关键字了,dynamic也很少使用,除非一些特殊场景.

作用

@property会生产一个带下划线的成员变量,set/get方法声明和实现。
@synthesize会生成一个同名的成员变量作为set/get方法的实现。还可以指定一个属性和成员变量绑定 @synthesize 属性 = 成员变量
@dynamic 告诉编译器set/get方法我自己来实现。

@synthesize 属性 = 成员变量 使用场景

1.Protocol因为协议中的属性,只有getter setter方法的声明,没有成员变量, 使用synthesize会默认生产getter 方法,setter方法,和一个成员变量
2.同时重写setter和getter方法
用@property声明的成员属性,相当于自动生成了setter getter方法,如果重写了set和get方法,与@property声明的成员属性就不是一个成员属性了,是另外一个实例变量,而这个实例变量需要手动声明。所以会报错误。
3.如果readonly修饰的属性,重写了getter方法

示例

@property

@interface CViewController ()
@property (nonatomic , copy) NSString *name;
@end  

////property做的是事情相当于生成一个_name成员变量,setName,name方法声明及实现.等价于⬇

@interface CViewController (){
    NSString *_name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
@end

@implementation CViewController
-(void)setName:(NSString *)name{
    _name = name;
}
-(NSString *)name{
    return _name;
}
@end

@synthesize

@interface CViewController ()
@property (nonatomic , copy) NSString *name;
@end  
@implementation CViewController
@synthesize name;
@end

synthesize做的事情生成一个同名的成员变量name,set和get方法声明和实现.为什么没有生成下划线name? 因为property会做一件事情发现没有成员变量的时候生成一个成员变量_name,然后调用@synthesize name = _name,把_name作用到name的setter和getter方法中.因为我们自己写@synthesize name,所以不会生成_name变量.

@interface CViewController ()
{
    NSString *name;
}
-(void)setName:(NSString *)newName;
-(NSString *)name;
@end

@implementation CViewController
@synthesize name;
-(void)setName:(NSString *)newName{
    name = newName;
}
-(NSString *)name{
    return name;
}
@end