OC-属性(@property和@Synthesize)

1、简介

属性是 Objective-C 2.0 定义的语法,提供 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 中实现两个方法
    setter方法:

-(void)setName:(NSString *)name { 
      _name = name;      }

getter方法:

-(NSString *)name {       
         return _name;      }

2、属性的特性

a. 属性和实例变量

属性的作用是生成 setter 以及 getter 方法的实现,如果方法内部操作的实例变量未定义,系统会自动生成一个 _属性名 的实例变量,但是生成的实例变量的可见度是私有的,子类不可以访问

一旦同时重写了 setter、getter 方法,并且没有实现 @synthesize,@synthesize 就不再生成实例变量。

b. 属性的特性

Objective-C 提供属性的目的是为了简化程序员的编码。Objective-C 为属性提供了一些关键字用以控制 setter、getter 的实现细节,这些关键字我们称之为 属性的特性(attribute)。

  • 读写性 
    读写性的控制(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;

setter 和 getter方法内部实现:

-(void)setAge:(NSInteger)age {
        _age = age;
    }

    - (NSInteger)age {
        return _age;
    }

retain:一般对象作为属性(比如NSString等)的时候,并且要保留这个对象的时候。
@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];
}

3、其他

  • 属性是一对 setter 、getter 方法,点语法是属性的另一种调用格式
  • #import "..." 引入类的接口部分,容易造成循环引入
  • @class 只是告诉编译器后面的字符是一个类名,并不会引入类的接口部分
  • 在 .h 文件中使用 @class 声明类后,要使用类中方法,需要在 .m 文件中使用#import "..." 引入

参考:http://www.cnblogs.com/gfxxbk/p/5308138.html

你可能感兴趣的:(OC-属性(@property和@Synthesize))