美文网首页
2018-01-18 Objective-C 中的@proper

2018-01-18 Objective-C 中的@proper

作者: super_2e20 | 来源:发表于2018-01-18 11:16 被阅读0次
    1.@property是什么

    @property是生命力属性语法,它可以快速方便的为实例变量创建存取器,并允许我们通过点语法适用存取器。
    存取器 (accessor):只用于获取和设置实例变量的方法。用于获取实例变量值存取器是getter,用于设置实例变量的存取器是setter

    2.创建存取器
    // Car.h
    #import <foundation foundation.h="">
    @interface Car : NSObject
    {
      // 实例变量
      NSString *carName;
      NSString *carType;
    }
    // setter                                   
    - (void)setCarName:(NSString *)newCarName; 
     // getter
     - (NSString *)carName;
    // setter
    - (void)setCarType:(NSString *)newCarType;
    // getter
    - (NSString *)carType;
    @end</foundation>
    

    2.2使用@property创建存取器

    // Car.h
    #import <foundation foundation.h="">
    @interface Car : NSObject
     {
    // 实例变量
    NSString *carName;
    NSString *carType;
    }
    @property(nonatomic,strong) NSString *carName;
    @property(nonatomic,strong) NSString *carType;
    @end
    

    2.3使用@synthesize创建存取器

        // Car.m
       #import "Car.h"
       @implementation Car
        @synthesize carName;
        @synthesize carType;
       @end
    

    总结:@property等同于在.h文件中声明实例变量的get/set方法,@synthesize等同于在.m文件中实现实例变量的get/set方法。使用@property和synthesize创建存取器要比手动声明两个存取方法(getter和setter)更简单。而且我们在使用属性时可以使用点语法赋值或取值,语法更简单,更符合面向对象编程。

    那么如果我们不喜欢默认的实例变量命名方法,或者我们希望使用更有语义的名称,应该怎么做呢。其实很简单:

     // Car.m
       #import "Car.h"
      @implementation Car
      @synthesize carName = i_am_car_name;
      @synthesize carType = i_am_car_type;
      - (NSString *)carInfo
         {
          return [NSString stringWithFormat:@"The car name is %@ and the type is %@",i_am_car_name,i_am_car_type];
       }
      @end
    
    3.@property的特性

    3.1原子性

    atomic(默认的): atomic意为操作原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上时安全的。很少使用,因为影响效率
    nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证多线层环境下的安全性。在单线程和明确只有一个线程访问的情况下广泛使用

    3.2存取控制

    readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。
    readonly: readonly表示只有getter没有setter

    有时候未来语意更明确可能需要自定义访问器的名字

      @property(nonatomic,setter = mySetter:,getter= myGetter) NSString *name;
      @property (nonatomic, getter = isHidden) BOOL hidden;
    

    3.3 内存管理

    @property有显示的内存管理策略。
    assign(默认):assign用于值类型,如int 、float、double和NSInterger、CGFloat等表示单纯的复制。还包括不存在的所有权关系的对象,比如常见的delegate。

      @property(nonatomic) int count;
      @property(nonatomic,assign) int count;
    

    在setter方法中,采用直接赋值来事先设置操作

     -(void)setCount:(int)newCount{  
       
          _ count = newCount;  
    }
    

    retain:在setter方法中,需要对传入的对象进行引用计数加1的操作。

    -(void)setName:(NSString*)_name{  
     //首先判断是否与旧对象一致,如果不一致进行赋值。  
     //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。  
     if ( name != _name){  
          [name release];  
          name = [_name retain];  
          }  
    }
    

    strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有所有权关系,即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

    weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作
    简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。

    注:weak关键字是IOS5引入的,IOS5之前是不能使用该关键字的。delegate 和 Outlet 一般用weak来声明。

    copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。

    相关文章

      网友评论

          本文标题:2018-01-18 Objective-C 中的@proper

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