Objective-C 2.0 @property

 Objective-C 2.0增加了特性(@property,@synthesize),

简化了我们在类中创建成员变量访问设置的过程

局限性:不支持接受额外参数的方法,比如

- (void)setTire:(Tire *) tire

           atIndex:(int) index;

- (Tire *)tireAtIndex:(int)index;

 

特性使用的格式如下:

@property (atomic/nonatomic,readonly/readwrite,assign/retain/copy) 变量类型 memberObject;

@synthesize memberObject;

 

//第一类,原子性atomic(nonatomic),默认是atomic,

atomic : 读取函数为原子操作;

nonatomic : 禁止多线程,对变量进行保护;

atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的

时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,

所以在IPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么

nonatomic是一个非常好的选择。

 

//第二类,读写属性(readwrite/readonly),默认是readwrite

readwrite : 产生setter/getter的方法;

readonly : 只产生getter的简单方法,没有setter;

 

//第三类,assign/retain/copy 决定了以何种方式对成员变量赋予新值,默认是assign

assign : 简单赋值,不进行retian工作,不更改引用计数(retain count),

            assign一般用在Objc基础数据类型 (NSInteger,CGFloat(double),BOOL)和

            C数据类型(int, float, double, char, 等等), 或对指针的弱引用

retain : 引用计数加一,setter的方法对参数进行release旧值,再retain新的值,

            一般用在NSObject和其子类。

            - (void)SetName:(NSString *)newName{

               if(name != newName){

                  [name release];

                  name = [newName retain];

               }

            } 

 

copy : 拷贝创建一个引用计数为1的新对象,类似于C语言的深复制, 一般用在NSString类。

           - (NSString)title{

                return [[instanceVar retain] autorelease];

           }


          - (void)setTitle:(NSString *)newTitle{

               if (instanceVar != newTitle){

               [instanceVar release];

               instanceVar = [newTitle copy];

               //or retain,depending on object & usage;

               }

          }


示例:readonly和retain结合使用场合

@property (nonatomic,readonly,retain)NSString *strName;

strName = @"newName";      //只能在类内部直接修改变量(正确)


不能在类内部或类外部使用设置函数访问变量

self.strName = @"newName";//(错误)

Person.strName = @"newName";//(错误)

self.strName = @"newName";//使用参数(@"newName")

                                                   //调用访问器方法(setName:)修改实例变量



你可能感兴趣的:(多线程,iPhone,float,setter,getter,通讯)