基础——@synthesize 和 @dynamic

一:定义

@property有两个对应的词,

@synthsize   @dynamic  如果都没写,那么默认就是@synthsize var = _var;

1: @synthsize 如果没有手动实现setter getter方法那么自动生成 ,自动生成_var变量

2: @dynamic告诉编译器:属性的setter,getter方法由用户自己实现, 不自动生成。假如一个属性被声明为@dynamic var 那么如果不实现setter getter方法,编译阶段不会报错,但是一旦使用instance.var = someVar , 程序将crash。

二: 应用

1: 同时重写 set / get 方法, 需要手动定义一个变量 或者 使用@synthesize 指定一个变量来绑定到属性上。

手动定义变量:

.h 文件

#import <Foundation/Foundation.h>
@interface Girl : NSObject
@property (nonatomic, copy) NSString *name;
@end

.m文件

#import "Girl.h"

@implementation Girl
/* *************** MARK: 方法一 *************** */
{
    NSString* _name; //手动注册变量
}
- (NSString *)name{
    if (!_name) {
        _name = @"zhangli";
    }
    return _name;
}
- (void)setName:(NSString *)name{
    _name = name;
}

@end

如果不去手动定义一个变量,那么单独写getter或setter没有问题,但是同时重写就会报错了。

@synthesize

/* *************** MARK: 方法二 *************** */
@synthesize name = _name; //使用@synthesize,将属性对应于变量
- (NSString *)name{
    if (!_name) {
        _name = @"zhangli";
    }
    return _name;
}
- (void)setName:(NSString *)name{
    _name = name;
}

属性name原本是对应于_name变量的,这里通过@synthesize改变了属性、getter、setter对应的变量。(这点很有用处,比如可以在子类修改父类中readonly属性的值。

如果不需要自定义实现setter、getter,那么只需要写一个@synthesize property = newName;

猜你喜欢

转载自blog.csdn.net/haifangnihao/article/details/88794986
今日推荐