美文网首页iOS进阶
@synthesize 的理解

@synthesize 的理解

作者: 若水water | 来源:发表于2020-05-08 13:51 被阅读0次

@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

相关文章

网友评论

    本文标题:@synthesize 的理解

    本文链接:https://www.haomeiwen.com/subject/qxwfchtx.html