美文网首页iOS 一般知识点
ios @proterty @synthesize详解

ios @proterty @synthesize详解

作者: LeeRich | 来源:发表于2018-02-01 14:31 被阅读8次
    作者:反调唱唱
    链接:https://www.jianshu.com/p/70c7bf99576b
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    @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等
    

    相关文章

      网友评论

        本文标题:ios @proterty @synthesize详解

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