objective-c在Xcode中@property相关参数的解释

objective-c在其对象拥有成员变量时,我们为了保持代码的封装,会将成员变量设置为@protected,并为成员变量编写setter和getter方法。

如:

@interface Person : NSObject
{
    @protected
    int _age;
}
- (int)get;
- (void)setAge:(int)age;
@end

@implementation Person
- (int)get
{
    return _age;
}
- (void)setAge:(int)age
{
    _age = age;
}
@end

在Xcode中,为了让我们摆脱这种枯燥的格式化代码,增加了@property属性设置,使用@property属性,编译器会自动帮我们实现这些代码,

如:

@interface Person : NSObject
@property int age;
@end

@implementation Person
@end

这段代码经过编译器编译后与上面的代码完全相同。

但是,在实际应用中,内存管理,多线程,成员变量是否只读等等需求很多,所以@property为我们提供了很多参数来实现这些不同的需求,如下:

1.内存管理相关:

*retain:release旧值,retain新值(适用于对象类型的成员变量)

*assign:直接赋值(默认参数,适用于基本数据类型的成员变量)

*copy: release旧值,copy新值

注:关于内存管理,请阅读http://www.cnblogs.com/yoran-yang/p/4293546.html

以retain为例:

@interface Person : NSObject
@property (retain) Book *book;
@end

等同于:

@interface Person : NSObject
{
    @protected
    Book *_book;
}
- (Book *)get;
- (void)setBook:(Book *)book;
@end

@implementation Person
- (Book *)get
{
    return _book;
}
- (void)setBook:(Book *)book
{
    if(book != _book)
    {
        [book release];
        _book = [book retain];
    }
}
@end

2.读写控制相关

*readwrite:同时生成getter与setter的声明和实现(默认参数)

*readonly:只生成getter方法

3.多线程相关

*nonatomic:禁止多线程,变量保护,提高性能,读写成员变量的操作效率可以提高数倍(强烈建议在非多线程环境的程序加上此参数)

*atomic:线程安全的,性能低(默认参数为线程安全的,即加线程锁)

4.setter和getter方法的名称

*getter =(getter的方法名)

*setter =(setter的方法名)注意:此方法名必须加上后面的“:”。