Using Property in Obj-C(Obj-C中属性的使用)

Using Property in Obj-C(Obj-C中属性的使用)

基础格式:

 

1 @interface YourMotherObject : YourMothersMotherObject
2 {
3     ... // 声明成员变量
4 }
5 @property (属性值) 成员变量类型 成员变量名
6 @end

 

属性值介绍(懒得写,Copy来的):

 

readonly

 此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。

readwrite

此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。

assign

此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain

指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数。实际上如果你对基本数据类型或Core Foundation对象使用retain属性将得到编译错误。

copy

它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。

nonatomic

指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic ,那么访问器只是简单地返回这个值。在非多线程环境下不必使用原子操作,以提高效率。

示例:

@interface YourMotherObject
{
unsigned int yourmother;
unsigned int yoursister;
UIWindow *window;
MainView *mainView;
}

- (void)applicationDidFinishLaunching:(id)arg1;
- (void)applicationWillSuspend;
- (void)dealloc;

@property(retain) UIView *mainView; // @synthesize mainView;
@property(retain) UIWindow *window; // @synthesize window;

/* Can't be compiled
@property(retain) unsigned int yourmother;
*/

/* OK */
@property (nonatomic, readwrite) unsigned int yoursister;
@end

 在实现里,只需要
@synthesize  mainView;
@synthesize windows;

@synthesize yoursister;
就可代替 繁琐的setter, getter方法, 这样就可让编译器自动生成读写函数,并使用点表示法(.)来访问属性

如self.yoursister = 3将实际调用 [self setYoursister:3],这个setYoursister方法就是由@synthesize yoursister语句告知编译器为你自动生成的。同时生成的还有yoursister方法(同变量名,即getter),也可以使用如下方法自成生成相应的方法,使用@dynamic 方法名。

@property(nonatomic, readwrite) unsigned int yoursister;
@dynamic   yoursister;

-  (unsigned int)yoursister
{
    //any code...
} 

注意在类的实现中,直接使用成员变量名(如上面的yoursister),将直接给成员变量赋值,而使用self.成员变量名或对象.成员变量名将调用属性生成的方法。另外注意,在Obj-C中,成员变量默认的访问权限是protected,当然也可以使用@public,@private,@protected显示指定。

补充内容:

读写属性(readwrite/readonly)
setter语意(assign/retain/copy)
原子性atomicity(nonatomic)

assign/retain/copy 决定了以何种方式对数据成员赋予新值
atomicity的默认值是atomic,读取函数为原子操作。

经常用到的参数是 copy/reain/assign。在其中选择一个来确定属性的setter如何处理这个属性。很多Objective-C中的object最好使用用retain,一些特别的object(例如:string)使用copy。

assign关键字代表setter直接赋值,而不是复制或者保留它。这种机制非常适合一些基本类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。

readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

posted @ 2012-09-06 17:04  Jone Zhang  阅读(759)  评论(0编辑  收藏  举报