property
@property基本使用
- 背景: @porperty是一個編譯器指令, 在Xocde4.4之前, 可以使用@porperty來代替getter/setter方法的聲明, 也就是說我們只需要寫上@porperty就不用寫getter/setter方法的聲明, 由編譯器生成某一個屬性的getter/setter方法的聲明
Person.h中代碼示例
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
//- (void)setAge:(int)age;
//- (int)age;
@property int age;//Xocde4.4之前, 相當(dāng)于上面兩句
@end
@synthesize基本使用
背景: @synthesize是一個編譯器指令, 它可以簡化getter/setter方法的實現(xiàn)
什么是實現(xiàn): 在聲明后面寫上大括號就代表著實現(xiàn)
作用: 1.在@synthesize后面告訴編譯器, 需要實現(xiàn)哪個@property生成的聲明; 2. 告訴@synthesize, 需要將傳入的值賦值給誰和返回誰的值給調(diào)用者
Person.m中代碼示例
#import "Person.h"
@implementation Person
/*
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
*/
@synthesize age = _age;//等價于上面的兩個方法
//注意:如果在@synthesize后面沒有告訴系統(tǒng)將傳入的值賦值給誰, 系統(tǒng)默認(rèn)會賦值給和@synthesize后面寫得名稱相同的成員變量
@end
@property增強
背景: Xcode4.4以后apple對@property進(jìn)行了一個增強, 以后只要利用一個@property就可以同時生成setter/getter方法的聲明和實現(xiàn)
-
@property有一個弊端: 它只會生成最簡單的getter/setter方法的聲明和實現(xiàn), 并不會對傳入的數(shù)據(jù)進(jìn)行過濾
- 如果想對傳入的數(shù)據(jù)進(jìn)行過濾, 那么我們就必須重寫getter/setter方法
- 如果不想對傳入的數(shù)據(jù)進(jìn)行過濾, 僅僅是提供一個方法給外界操作成員變量, 那么就可以使用@property
-
@property自動生成一個_開頭的成員變量:
- 如果利用@property來生成getter/setter方法, 那么我們可以不寫成員變量, 系統(tǒng)會自動給我們生成一個_開頭的成員變量
-
注意:
- @property自動幫我們生成的成員變量是一個私有的成員變量, 也就是說是在.m文件中生成的, 而不是在.h文件中生成的
- 如果同時重寫了getter/setter方法, 那么property就不會自動幫我們生成私有的成員變量
@property修飾符
-
讀寫權(quán)限:
-
readonly
: 只會生成getter方法 -
readwrite
: 既會生成getter也會生成setter, 默認(rèn)什么都不寫就是readwrite
-
-
getter勘纯、setter:
-
getter
: 可以給生成的getter方法起一個名稱 -
setter
: 可以給生成的setter方法起一個名稱
-
-
多線程相關(guān):
-
atomic
:性能低(默認(rèn)) -
nonatomic
:性能高(開發(fā)中使用nonatomic)
-
-
內(nèi)存管理相關(guān):
retain
: 就會自動幫我們生成getter/setter方法內(nèi)存管理的代碼, 用于MRCassign
: 不會幫我們生成set方法內(nèi)存管理的代碼, 僅僅只會生成普通的getter/setter方法,用于基本數(shù)據(jù)類型, 默認(rèn)什么都不寫就是assignstrong
: ARC中保存一個對象用strong, 相當(dāng)于MRC中的retain, 用于ARCweak
: 在ARC中如果 弱引用對象不要用assign, 用weak, assign是專門用于保存基本數(shù)據(jù)類型的, 如果保存對象用weak關(guān)于內(nèi)存管理的修飾符址芯,詳見: property 關(guān)鍵字的區(qū)別詳解:assign 與weak、 __block 與 __weak鞠评、strong 與copy的區(qū)別