interface property笔记

oc;有2种定义变量的方式
1.在  @interface :NSObject{} 的括号中,当然NSObject 是指一个父类,可以是其他的。
形式如下:1

2
3
4
@interface GCTurnBasedMatchHelper : NSObject {
  BOOL gameCenterAvailable;
  BOOL userAuthenticated;
  }

2.另外一种是直接在 @interface : NSObject{}括号之后,用 @property 去定义一个变量。
[objc]@property (assign, readonly) BOOL gameCenterAvailable;[/objc]
你会发现,有人会再@interface中定义了变量后,又在 @property中重复定义相同的变量,而且很常见。
结果可能是这样:

1
2
3
4
5
@interface GCTurnBasedMatchHelper : NSObject {
BOOL gameCenterAvailable;
BOOL userAuthenticated;
 }
@property (assign, readonly) BOOL gameCenterAvailable;

1. 只在@interface中定义变量的话,你所定义的变量只能在当前的类中访问,在其他类中是访问不了的;而用@property声明的变量可以在外部访问。

2.用了@property去声明的变量,可以使用“self.变量名”的方式去读写变量。而用@interface的方式就不可以。

3.

  • 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
  • 使用copy: 对NSString
  • 使用retain: 对其他NSObject和其子类

     @property(retain,nonatomic)UILabel *text;

  •   retain 通知编译器向分配给此属性的对象发送一个保留信息。这将确保底层的实例变量不会从内存中清除。
  • nonatomic  原子属性,多线程时使用,用于读写的唯一性。
  •  

    声明property的语法为:@property (参数1,参数2) 类型 名字;

     
    1. @property(nonatomic,retain) UIWindow *window;  

    其中参数主要分为三类:

     

    读写属性: (readwrite/readonly)

    setter语意:(assign/retain/copy)

    原子性: (atomicity/nonatomic)

    各参数意义如下:

    readwrite: 产生setter\getter方法

    readonly: 只产生简单的getter,没有setter。

    assign: 默认类型,setter方法直接赋值,而不进行retain操作

    retain: setter方法对参数进行release旧值,再retain新值。

    copy: setter方法进行Copy操作,与retain一样

    nonatomic: 禁止多线程,变量保护,提高性能

 首先,我们看atomic 与nonatomic的区别与用法,讲之前,我们先看下面这段代码:

复制代码
@property(nonatomic, retain) UITextField *userName;    //1

@property(nonatomic, retain,readwrite) UITextField
*userName; //2

@property(atomic, retain) UITextField
*userName; //3

@property(retain) UITextField
*userName; //4

@property(atomic,assign)
int i; // 5

@property(atomic)
int i; //6
@property int i;               //7
复制代码

  请读者先停下来想一想,它们有什么区别呢?

  上面的代码1和2是等价的,3和4是等价的,5,6,7是等价的。也就是说atomic是默认行为,assign是默认行为,readwrite是默认行为。但是,如果你写上@property(nontomic)NSString *name;那么将会报一个警告,如下图:

  因为是非gc的对象,所以默认的assign修饰符是不行的。那么什么时候用assign、什么时候用retain和copy呢?推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。

 

 

posted @ 2012-11-22 16:38  xiaoxiaoxigua  阅读(298)  评论(0)    收藏  举报