@synthesize 的理解
2020-05-08 本文已影响0人
若水water
@synthesize
在低版本中,类中声明了属性,系统并不会自动生成实例变量,和setter getter方法实现,必须在 类的实现中 声明 @synthesize 属性名 = _属性名(也可以自定义别的名字)
,@synthesize
的作用就是 定义实例变量,同时实现 setter 和 getter方法。但是在高版本(具体哪个版本 ,请自行百度)中就不用在 声明@synthesize
,系统会自动生成 _属性名
实例变量 和 改属性getter setter方法实现。
- 给属性设置别名
例如 声明了属性 name,那么系统会自动生成 _name 实例变量,同时实现setter 和 getter 方法,即是 对_name 这个变量赋值,获取这个变量的值
@property (nonatomic,copy) NSString *name;
如果我们想要为这个属性设置一个别名可以使用以下方法,设置了别名就不能使用系统自动生成的_name,得使用 _myName
@synthesize name = _myName;
//或者 ,这样生成的实例变量名称和属性名称默认一样
@synthesize name;
- 同时重写setter 和 getter方法
众所周知,属性的 setter和 getter方法是不能同时重写的,因为你同时重写了这两个方法,系统就不会帮你生成实例变量了,所以会报错,说不存在这个变量。但是有时候需要重写,那么我们就自定义实例变量
@interface ViewController ()
@property(nonatomic, strong) NSString *name;
@end
@implementation ViewController
@synthesize name = _name;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.name = @"hahhah";
NSLog(@"name = %@",_name);
}
- (void)setName:(NSString *)name {
_name = [NSString stringWithFormat:@"我:%@",name];
}
- (NSString *)name {
return _name;
}
@end
- 在@protocol 中声明了 属性,其实是在协议中声明了 setter和 getter方法,但是没有实现,也没有实例变量,所以当实现这个协议,就要实现setter和getter方法,并且添加一个实例变量
@protocol ZFPlayerMediaPlayback <NSObject>
@required
/// The view must inherited `ZFPlayerView`,this view deals with some gesture conflicts.
@property (nonatomic) ZFPlayerView *view;
@optional
//ZFAVPlayerManager 实现了 ZFPlayerMediaPlayback协议
@implementation ZFAVPlayerManager
//声明了实例变量_view,同时实现了 setter和getter方法
@synthesize view = _view;
@end
@dynamic
这个修饰符就是告诉编译器 不自动生成该属性的 setter 和 getter方法,当然也不会生成对应的实例变量
@interface ViewController () <ViewControllerDelegate>
{
NSString *_name ;
}
@property(nonatomic, strong) NSString *name;
@end
@implementation ViewController
@synthesize ppp = _ppp;
@dynamic name; //告诉编译器 不自动生成 getter setter ,由用户自己生成
- (void)viewDidLoad {
[super viewDidLoad];
self.name = @"hahhah";
}
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end