ARC 屬性@property(總結(jié)《Effective Objective-C 2.0》)

屬性特質(zhì)分為4種

1、原子性

2、讀寫權(quán)限

3、內(nèi)存管理語義

4、方法名

</br>
1、原子性(2種)
(1)atomic(默認(rèn))
(2)nonatomic

2、讀寫權(quán)限(2種)
(1)readwrite(默認(rèn))
(2)readonly

3、內(nèi)存管理語義(5種) ——這組特質(zhì)僅會影響“設(shè)置方法”,即setter
(1)assgin (非對象類型默認(rèn)屬性,相當(dāng)于unsafe_unretained,適用于int、float、CGFloat、NSInteger等)
(2)unsafe_unretained (對象類型默認(rèn)屬性,相當(dāng)于assgin,適用于NSObject、NSArray,NSDictionary等)
(3)weak
(4)strong
(5)copy

4、方法名
(1)編譯器會自動生成屬性存取方法(默認(rèn))
(2)getter = <取值方法名>
(3)setter = <設(shè)置方法名>

比如,自己寫了一個屬性name

@property (strong, nonatomic) NSString *name;

以下2個方法將自動生成,但不會在編輯器Xcode里面看到:

- (void)setName: (NSString *)name {
    ...
}

- (NSString *)name {
    ...
}

如果不想要默認(rèn)的存取方法名,就可以使用這個特質(zhì)寫一個自定義的方法名:

@property (strong, nonatomic, setter=setMyName) NSString *name;

這樣設(shè)置方法名就會變成下面這樣

- (void)setMyName: (NSString *)name {
    ...
}

同理,在屬性特質(zhì)中加入 getter = xxx 可自定義取值方法。

我們可以同時(shí)把4種特質(zhì)都用上,像下面這樣:

@property (nonatomic, readwrite, strong, getter=myName, setter=setMyName) *name;

</br>

特質(zhì)在確定屬性需求時(shí)最好顯式指定,便于自己和他人理解其語義

除以下特殊情況外:讀寫權(quán)限為readwrite時(shí)可省略。

如果需要一個nonatomic,readwrite,unsafe_unretained,使用默認(rèn)存取方法的name屬性

不推薦的寫法:

@property (nonatomic) NSString *name;

推薦的寫法:

@property (nonatomic, unsafe_unretained) NSString *name;

</br>

每個屬性特質(zhì)適用情景

1、原子性

atomic:

在iOS開發(fā)中幾乎不用,有性能問題;Mac OS X開發(fā)可用。對象和非對象都能用。

nonatomic:

在iOS開發(fā)中幾乎要用到。對象和非對象都能用。

2、讀寫權(quán)限

readwrite:

屬性擁有g(shù)etter和setter。

readonly:

屬性只有g(shù)etter,讀操作會被視為非法。

如果要對外公開屬性為只讀,對內(nèi)進(jìn)行讀寫,可以這么做:

//Person.h
@interface Person: NSObject
@property (nonatomic, readonly, copy) NSString *firstName;
@property (nonatomic, readonly, copy) NSString *lastName;

@end
//Person.m
@interface Person () {
@property (nonatomic, readwrite, copy) NSString *firstName;
@property (nonatomic, readwrite, copy) NSString *lastName;
}

@implementation Person

@end

在實(shí)現(xiàn)文件中Person類分類定義了firstName和lastName的讀寫權(quán)限是readwrite,所以可以在實(shí)現(xiàn)文件內(nèi)部修改它們。但在外部看來,它們是不可寫的。

3、內(nèi)存管理語義(“持有”、“保留”、“釋放”等概念均源于MRC)

assign:

非對象類型唯一可用內(nèi)存管理語義。你不用就沒得用了。

unsafe_unretained:

非持有關(guān)系(不保留,"unretained")。意思是,為這種屬性設(shè)置新值時(shí),設(shè)置方法既不會保留新值,也不釋放舊值。當(dāng)目標(biāo)對象被銷毀時(shí),屬性值不會自動清空(不安全,"unsafe")。

weak:

非持有關(guān)系。意思是,為這種屬性設(shè)置新值時(shí),設(shè)置方法既不會保留新值,也不釋放舊值。當(dāng)目標(biāo)對象被銷毀時(shí),屬性值會自動清空(置為nil)。

strong:

持有關(guān)系。意思是,為這種屬性設(shè)置新值時(shí),設(shè)置方法會先保留新值,再釋放舊值,然后設(shè)置新值。

copy:

用來保護(hù)屬性的封裝性。使用了copy,等于給設(shè)置方法加了一條copy語句。

沒有使用copy的設(shè)置方法:

- (void)setName: (NSString *)name {
    _name = name;
}

使用了copy的設(shè)置方法:

- (void)setName: (NSString *)name {
    _name = [name copy];
}

如何保護(hù)?設(shè)置方法會遇到2種情況,還是用屬性name的例子來說明
第一種情況,設(shè)置方法傳入的是一個不可變字符串:

- (void)setName: (NSString *)name {
    _name = [name copy];
}

設(shè)置方法的參數(shù)name是一個NSString類型。對NSString類型發(fā)送copy消息,是淺復(fù)制,只復(fù)制了指針,_name和參數(shù)name指向同一個地址。這種情況可以說strong與copy無異,它相當(dāng)于執(zhí)行下面這個方法:

- (void)setName: (NSString *)name {
    _name = name;
}

第二種情況,設(shè)置方法傳入的是一個可變字符串:

- (void)setName: (NSString *)name {
    _name = [name copy];
}

設(shè)置方法的參數(shù)name是一個NSMutableString類型。因?yàn)镹SMutableString是NSString的子類,合法。對NSMutableString類型發(fā)送copy消息,是深復(fù)制。_name和參數(shù)name指向不同的地址。這樣你在外部修改了參數(shù)name,_name也不會變,這就保護(hù)了_name的封裝性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寫在最前面: 這是我讀這本書的第一遍,目前暫定為1.0版本吧。很多地方都還沒有很好的理解透徹,只是理解到了一點(diǎn)皮毛...
    LaiYoung_閱讀 1,948評論 4 18
  • Objective-C 語言的起源 Objective-C 使用“消息結(jié)構(gòu)”(messaging structur...
    Junetaurus閱讀 524評論 0 1
  • 聲明:這個筆記的系列是我每天早上打開電腦第一件做的事情,當(dāng)然使用的時(shí)間也不是很多因?yàn)檫€有其他的事情去做,雖然吧自己...
    iSuAbner閱讀 890評論 2 16
  • 構(gòu)造函數(shù)是一種特殊的函數(shù),主要用來在創(chuàng)建對象時(shí)初始化對象,為對象成員變量設(shè)置初始值,在 OC 中的構(gòu)造函數(shù)是 in...
    MarkusFeng閱讀 376評論 0 1
  • 大片的彼岸花群在原野盛開的時(shí)候,就到了鳥兒們遷徙的日子。 那些頭上長著蘆花般白色絨毛的鳥兒,飛向高遠(yuǎn)的天空時(shí),都會...
    測謊儀閱讀 442評論 0 2

友情鏈接更多精彩內(nèi)容