ios @proterty @synthesize详解

96
反调唱唱
0.1 2016.07.25 17:41* 字数 514

@proterty @synthesize
是为了方便开发,提高开发效率添加的自动生成get和set方法方法。

@property(nonatomic,copy)NSString *name;
相当于是声明了:

  • (NSString *)name;
  • (void)setName:(NSString *)str;

而@synthesize name = _name;
先去访问同名变量;
如果没有定义NSString *_name;
相当定义了先NSString *_name;
再实现了:

  • (NSString *)name{
    return _name;
    }
  • (void)setName:(NSString *)str{
    if(_name != str){
    [_name release];
    _name = [str retain];
    }
    }
    当然,如果自己本身就已经实现了
  • (NSString *)name;
  • (void)setName:(NSString *)str;
    这两个方法,那么系统就不再实现了。
    对于现在,如果不使用@synthesize name = _name;
    也默认是使用@synthesize name = _name;

@synthesize name;
如果使用的是@synthesize name;
那么对于上面的变量则为生成的是name而不是_name;
相当于是

  • (NSString *)name{
    return name;
    }
  • (void)setName:(NSString *)str{
    if(name != str){
    [name release];
    name = [str retain];
    }
    }

@synthesize name = testName;
如果使用的是@synthesize name = testName;
则对于上面的变量则为生成的是testName而不是name,方法也对应改变,总之:定义的变量是根据@synthesize name = xx;来定的。

对于@property的参数
如果是使用@property(nonatomic,copy,getter=familyName)NSString *name;
则是相当于get方法为:

  • (NSString *)familyName;
    而实现的时候则为:
  • (NSString *)familyName{
    return name;
    }
    也可以使用setter=getFamilyName;不过如果同时使用getter=和setter=并且自己实现了相应方法的话,必须要用@synthesize name = xx;否则会报错。

对于@property各参数意义如下:

readwrite: 产生setter\getter方法(默认参数)
readonly: 只产生简单的getter,没有setter。
assign: 默认类型,setter方法直接赋值,而不进行retain操作(默认参数)
retain: setter方法对参数进行release旧值,再retain新值。
copy: setter方法进行Copy操作,与retain一样
nonatomic: 禁止多线程,变量保护,提高性能
atomic:原子性的访问方法(默认参数)
还有strong和weak等

日记本