IOS開發之@property的詳細介紹
在類中定義屬性時,總會使用到@property進行定義,下面就來說說@property的使用。
在使用過程中,如果需求公開且在其他類中使用時,通常會定義在.h頭文件中;而如果只是該類自已需要使用,這時則會定義
在.m實現文件中。
使用格式
@property (參數1, 參數2, 參數3, ...) 參數類型 參數名稱
參數包括三個種類,七個屬性,如下圖所示。
在使用過程中,有幾點需要注意:
(1)原子性定義中,如果沒有涉及到多線程環境時,通常不會使用默認值atomic;
(2)讀寫屬性通過采用默認值readwrite;
(3)set方法處理時,需要針對不同的類型使用參數,而不是全都使用默認值;
(4)set方法處理時,對于非對象參數類型,即基本數據類型,如int/float/double/BOOL等類型時,采用assign;
(5)set方法處理時,對于對象參數類型,如NSString/NSNumber/NSArray/…/NSDictionary等類型時,采用retain/copy;
(6)在使用過程中,定義某個屬性后,系統會自動生成setter/getter方法,但程序員可以根據需要修改setter/getter方法;
(7)同時會生成同名帶下劃線的成員變量,并在setter/getter方法中使用。
如,定義一個Person類的姓名、年齡:
使用默認值進行定義
@property age;
相當于
@property (atomic, assign) int age;
通過采用非原子性的,即
@property (nonatomic, assign) int age;
對象類型的定義不能使用如下方式,因為該形式定義時,是直接進行賦值,會造成內存泄露。
@property (nonatomic, assign) NSString *name;
正確的方式應該使用retain/copy進行定義
@property (nonatomic, retain) NSString *name;
默認生成的setter/getter方法分別是
- (void)setAge:(int)age;- (int)age;
- (void)setName:(NSString *)name;- (NSString *)name;
如果在定義時,重新定義了setter/getter方法,則系統默認分成的setter/getter方法則無效了,使用時,需要調用新定義的
@property (nonatomic, retain, setter = setMyName:, getter = getMyName) NSString *name;
此時,使用時setter/getter方法為
- (void)setMyName:(NSString *)myName;- (NSString *)getMyName;
早期的Xcode版本中,@property 還會結合 @systhesize 來使用才會生成setter/getter方法,如
@property (nonatomic, assing) int age;
@systhesize age;// 或@systhesize age = _age;
如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答