屬性

前提條件,我們?cè)谟懻搶傩缘膮?shù)問題喧锦。屬性參數(shù)是干嘛的?為什么會(huì)有屬性參數(shù)衬横?

屬性左右內(nèi)存。在設(shè)計(jì)類的時(shí)候终蒂,我們應(yīng)該充分運(yùn)用屬性來封裝數(shù)據(jù)蜂林,而數(shù)據(jù)就一定是要有存儲(chǔ)空間存儲(chǔ)的。而對(duì)于這些內(nèi)存的操作拇泣,是多種多樣的噪叙,我們?cè)诼暶鲗傩詴r(shí),必須要指明其內(nèi)存的操作方式霉翔,也就是其封裝的數(shù)據(jù)的操作方式(對(duì)象也是為了數(shù)據(jù)而生睁蕾,面向?qū)ο缶褪敲嫦驍?shù)據(jù)),便于內(nèi)存空間的管理债朵。


當(dāng)我們創(chuàng)建一個(gè)對(duì)象時(shí)子眶,會(huì)給該對(duì)象創(chuàng)建屬于自己的內(nèi)存空間,其中會(huì)為其屬性創(chuàng)建對(duì)應(yīng)的內(nèi)存空間序芦。

assign:將數(shù)值復(fù)制到當(dāng)前對(duì)象的內(nèi)存屬性空間中臭杰,該內(nèi)存空間的引用計(jì)數(shù)恒為1。同時(shí)谚中,不會(huì)對(duì)賦值源的引用計(jì)數(shù)產(chǎn)生影響渴杆。也就是說,被該關(guān)鍵字修飾的屬性內(nèi)存空間的引用計(jì)數(shù)永遠(yuǎn)是1宪塔。注意将塑,這個(gè)屬性只適用于基本數(shù)據(jù)類型,不能用于對(duì)象的操作(字符串蝌麸,數(shù)組,字典等都是對(duì)象)

copy:

深拷貝和淺拷貝:淺拷貝就是指針拷貝艾疟;深拷貝就是內(nèi)容拷貝

NSArray copy -> NSArray

NSMutableArray copy -> NSArray

NSString copy -> NSString

NSMutableString copy -> NSString

NSArray mutableCopy -> NSMutableArray

NSMutableArray mutableCopy -> NSMutableArray

NSString mutableCopy -> NSMutableString

NSMutableString mutableCopy -> NSMutableString

對(duì) immtable 類進(jìn)行 copy 来吩、 mutableCopy 得到的結(jié)果是不一樣得, mutableCopy 之后我們得到了一個(gè) NSArray 的可變版本蔽莱,并且內(nèi)存地址與原始的 array 不同弟疆,說明對(duì) immutable 類進(jìn)行 mutableCopy 得到的結(jié)果進(jìn)行了內(nèi)容拷貝,但是其容器內(nèi)部的數(shù)據(jù)并沒有拷貝內(nèi)容(地址沒有變化)盗冷,也就是說怠苔,拷貝了一個(gè); 而對(duì) immutable 類進(jìn)行 copy 操作仪糖,與原始的 array 是一毛一樣柑司, 也就是我們常說的迫肖,拷貝了一份指針。

對(duì)于一個(gè) mutable 類型的對(duì)象來說攒驰,不論進(jìn)行的是 copy 還是 mutableCopy 操作蟆湖,其地址 Address 都不一樣, 而其容器中的內(nèi)容不變玻粪。則隅津,對(duì)一個(gè) mutable 類型的對(duì)象進(jìn)行 copy 或者是 mutableCopy ,都拷貝了一個(gè)殼劲室,而容器內(nèi)的數(shù)據(jù)不會(huì)進(jìn)行拷貝內(nèi)容的操作伦仍。

淺copy,類似strong很洋,持有原始對(duì)象的指針充蓝,會(huì)使retainCount加一。淺copy和strong引用的區(qū)別僅僅是淺copy多執(zhí)行一步copyWithZone:方法蹲缠。

關(guān)鍵點(diǎn):找準(zhǔn)源對(duì)象類型才能分清copy 是淺拷貝還是深拷貝

不管是集合類對(duì)象棺克,還是非集合類對(duì)象,接收到copy和mutableCopy消息時(shí)线定,都遵循以下準(zhǔn)則:

copy返回imutable對(duì)象娜谊;mutableCopy返回mutable對(duì)象;

對(duì)copy返回值使用mutable對(duì)象接口就會(huì)crash

系統(tǒng)非集合類對(duì)象指的是 NSString, NSNumber ... 之類的對(duì)象

在非集合類對(duì)象中:

對(duì)immutable對(duì)象進(jìn)行copy操作斤讥,是指針復(fù)制纱皆,mutableCopy操作時(shí)內(nèi)容復(fù)制;

對(duì)mutable對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制芭商。

集合類的對(duì)象自身的 shallow copy 和 deep copy

我著重強(qiáng)調(diào) “對(duì)象自身” 是因?yàn)檫@里對(duì)象 是集合類型的派草,它具有存儲(chǔ)其它對(duì)象的能力, 對(duì)象自身 和 對(duì)象內(nèi)的元素 執(zhí)行的 copy操作是不同的铛楣。這里我們先看“對(duì)象自身”近迁,后面 我們會(huì)講 “對(duì)象內(nèi)的元素” copy操作。

集合類對(duì)象是指NSArray簸州、NSDictionary鉴竭、NSSet ... 之類的對(duì)象

在集合類對(duì)象中,對(duì)immutable對(duì)象進(jìn)行copy岸浑,是指針復(fù)制搏存,mutableCopy是內(nèi)容復(fù)制;對(duì)mutable對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制矢洲。但是:集合對(duì)象的內(nèi)容復(fù)制僅限于對(duì)象本身璧眠,對(duì)象元素仍然是指針復(fù)制。

對(duì)(集合類) 對(duì)象自身執(zhí)行深copy,對(duì) (集合類)對(duì)象內(nèi)部的元素 執(zhí)行淺copy责静,稱為集合類的單層深復(fù)制袁滥。

NSMutableString*mutableString1 = [NSMutableStringstringWithString:@"1"];

NSMutableString*mutalbeString2 = [NSMutableStringstringWithString:@"1"];

NSMutableArray*mutableArr = [NSMutableArrayarrayWithObjects:mutalbeString2,nil];

// mutableString1和mutableArr放入NSArray

NSMutableArray*testArr = [NSMutableArrayarrayWithObjects:mutableString1, mutableArr,nil];

NSArray*testArrCopy = [[NSArrayalloc]initWithArray:testArrcopyItems:YES];

NSLog(@"數(shù)組自身地址%p %p", testArr,&testArr);

NSLog(@"數(shù)組自身地址%p", testArrCopy);NSLog(@"查看數(shù)組內(nèi)部元素的地址---------------");

NSLog(@"%p", testArr[0]);NSLog(@"%p", testArrCopy[0]);

NSLog(@"%p", testArr[1]);NSLog(@"%p", testArrCopy[1]);

NSLog(@"查看數(shù)組中包含的數(shù)組中的元素的地址---------------");

// mutableArr中的元素對(duì)比,即mutalbeString2對(duì)比

NSLog(@"%p", testArr[1][0]);

NSLog(@"%p", testArrCopy[1][0]);

initWithArray: copyItems:會(huì)使NSArray中元素均執(zhí)行copy方法泰演。這也是我在testArr中放入NSMutableArray和NSMutableString的原因呻拌。如果我放入的是NSArray或者NSString,執(zhí)行copy后睦焕,只會(huì)發(fā)生指針復(fù)制藐握;如果我放入的是未實(shí)現(xiàn)NSCopying協(xié)議的對(duì)象,調(diào)用這個(gè)方法會(huì)crash垃喊。

查看內(nèi)存猾普,數(shù)組和數(shù)組中的元素(非數(shù)組的)都進(jìn)行了深拷貝,但是mutalbeString2的指針地址均沒有變化本谜,仍然是淺拷貝初家。所以這里的 深拷貝不是完全深拷貝 可以理解為 雙層深復(fù)制


完全深復(fù)制? (完美copy)

如果想 完美的解決NSArray嵌套NSArray這種情形,使用歸檔乌助、解檔的方式

NSMutableString*mutableString1 = [NSMutableStringstringWithString:@"1"];

NSMutableString*mutalbeString2 = [NSMutableStringstringWithString:@"1"];

NSMutableArray*mutableArr = [NSMutableArrayarrayWithObjects:mutalbeString2,nil];

// mutableString1和mutableArr放入NSArray

NSMutableArray*testArr = [NSMutableArrayarrayWithObjects:mutableString1, mutableArr,nil];

NSArray*testArrCopy = [NSKeyedUnarchiverunarchiveObjectWithData:[NSKeyedArchiverarchivedDataWithRootObject:testArr]];

NSLog(@"數(shù)組自身地址%p %p", testArr,&testArr);

NSLog(@"數(shù)組自身%p", testArrCopy);

NSLog(@"查看數(shù)組內(nèi)部元素的地址---------------");

NSLog(@"%p", testArr[0]);

NSLog(@"%p", testArrCopy[0]);

NSLog(@"%p", testArr[1]);

NSLog(@"%p", testArrCopy[1]);

NSLog(@"查看數(shù)組中包含的數(shù)組中的元素的地址---------------");

// mutableArr中的元素對(duì)比溜在,即mutalbeString2對(duì)比

NSLog(@"%p", testArr[1][0]);

NSLog(@"%p", testArrCopy[1][0]);

NSLog(@"修改元素---------------");

testArrCopy[1][0] =@"111";

NSLog(@"%@", testArr[1][0]);

NSLog(@"%@", testArrCopy[1][0]);

查看內(nèi)存,可見完成了完全深復(fù)制他托,testArr和testArrCopy中的元素掖肋,以及容器中容器的指針地址完全不同,所以完成了完全深復(fù)制赏参。testArr和testArrCopy數(shù)組內(nèi)的元素值修改互不影響志笼。

這里使用歸檔和解檔的前提是NSArray中所有的對(duì)象(NSString)都實(shí)現(xiàn)了NSCoding協(xié)議。(如果是你自定義的對(duì)象把篓,你需要單獨(dú)實(shí)現(xiàn)NSCoding協(xié)議 )

作為屬性:

用 strong 和 copy 修飾的屬性會(huì)被 copy

用 weak 和 assign 修飾的屬性不會(huì)被 copy

retain

readonly

readwrite

nonatomic

atomic

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纫溃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子韧掩,更是在濱河造成了極大的恐慌紊浩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疗锐,死亡現(xiàn)場(chǎng)離奇詭異坊谁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窒悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌买,“玉大人简珠,你說我怎么就攤上這事。” “怎么了聋庵?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵膘融,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我祭玉,道長(zhǎng)氧映,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任脱货,我火速辦了婚禮岛都,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘振峻。我一直安慰自己臼疫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布扣孟。 她就那樣靜靜地躺著烫堤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凤价。 梳的紋絲不亂的頭發(fā)上鸽斟,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音利诺,去河邊找鬼富蓄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛立轧,可吹牛的內(nèi)容都是我干的格粪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼氛改,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼帐萎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胜卤,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤疆导,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后葛躏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澈段,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年舰攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了败富。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摩窃,死狀恐怖兽叮,靈堂內(nèi)的尸體忽然破棺而出芬骄,到底是詐尸還是另有隱情,我是刑警寧澤鹦聪,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布账阻,位于F島的核電站,受9級(jí)特大地震影響泽本,放射性物質(zhì)發(fā)生泄漏淘太。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一规丽、第九天 我趴在偏房一處隱蔽的房頂上張望蒲牧。 院中可真熱鬧,春花似錦嘁捷、人聲如沸造成。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晒屎。三九已至,卻和暖如春缓升,著一層夾襖步出監(jiān)牢的瞬間鼓鲁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工港谊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骇吭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓歧寺,卻偏偏與公主長(zhǎng)得像燥狰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斜筐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容