iOS进阶

@synthesize 的理解

2020-05-08  本文已影响0人  若水water

@synthesize 在低版本中,类中声明了属性,系统并不会自动生成实例变量,和setter getter方法实现,必须在 类的实现中 声明 @synthesize 属性名 = _属性名(也可以自定义别的名字)@synthesize的作用就是 定义实例变量,同时实现 setter 和 getter方法。但是在高版本(具体哪个版本 ,请自行百度)中就不用在 声明@synthesize,系统会自动生成 _属性名实例变量 和 改属性getter setter方法实现。

@property (nonatomic,copy) NSString *name; 

如果我们想要为这个属性设置一个别名可以使用以下方法,设置了别名就不能使用系统自动生成的_name,得使用 _myName

@synthesize name = _myName;
//或者 ,这样生成的实例变量名称和属性名称默认一样
@synthesize name;
@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 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

上一篇下一篇

猜你喜欢

热点阅读