OC中的@property和@synthesize

学习链接:https://www.jianshu.com/p/2654198f4d08 

   OC中提供两个关键字@property和@synthesize,用于提供setter和getter方法,使得代码更加简洁,在这不多做介绍,看完会用就行。 

  一般@property在.h文件中使用,@synthesize在.m文件中使用

  • 以实例属性 _name 为例:
        属性声明:@property NSString *name;
    相当于在 @interface 中声明两个方法:
        setter方法:- (void)setName:(NSString *)name;
        getter方法:- (NSString *)name;

  • 属性的实现:在 .m 文件中使用 @synthesize 实现属性
       以实例变量 _name 为例:
       属性实现:@sybthesize name = _name;
       相当于在 @implementation 中实现两个方法

  原理其实就是系统会自动生成一个_属性名的变量,就比如
-(void)setName:(NSString *)name { 
      _name = name;      }
-(NSString *)name {       
         return _name;      }

  值得注意的是_属性名这个变量是私有的,如果重写了setter和getter变不再会自动生成了

  下面还有一些控制属性的特性:

  • 读写性 
    读写性的控制(readonly、readwrite、setter=、getter=)
      readonly:只读状态,是告诉编译器,属性值生成 getter 方法,不生成 setter 方法。
      readwrite:读写状态,是告诉编译器,属性值生成 getter 方法,又生成 setter 方法,既有设置器,也有访问器,默认的读写特性。
      setter=:指定属性生成的setter方法的名字。
      getter=:指定属性生成的getter方法的名字。

  • 原子性
    原子性控制(atomic、nonatomic)
    控制属性在多线程进行访问的安全问题。
      atomic:原子特性,是线程安全的访问,setter、getter 方法在多线程访问下是绝对安全的。每次只允许一个线程访问属性,默认是atomic,属性比较常用,atomic会不停对属性做加锁解锁操作,消耗资源,降低系统性能。
      nonatomic:非原子性控制,setter、getter方法内部不做线程安全控制,仅仅是普通的setter、getter方法,一般情况下使用nonatomic。

  • 语意特性
   
语义设置(assign、retain、copy)
 assign:一些基本数据类型(非对象类型,比如int、float等)的属性使用assign,使用assign,setter,getter方法直接赋值。
    
@property (nonatomic, assign) NSInteger age;

retain:一般对象作为属性(比如NSString等)的时候,并且要保留这个对象的时候,已修改全修改,跟strong差不多。
@property (nonatomic, retain) NSString *name;

-(void)setName:(NSString *)name {
      if (_name != name) {
          [_name release];
          _name = [name retain];
      }
  }

  - (NSString *)name {
      return  [[_name retain] autorelease];
  }

copy:一般对象需要拷贝一个对象副本的时候使用,拷贝了一份新的,原来的修改,新的不会修改。
@property (nonatomic, copy) NSString *gender;

-(void)setGender:(NSString *)gender {
    if (_gender != gender) {
        [_gender release];
        _gender = [gender copy];
    }
}

-(NSString *)gender {
    return  [[_gender retain] autorelease];
}
原文地址:https://www.cnblogs.com/caijiaming/p/13808992.html