iOS 淺談:深.淺拷貝與copy.strong

深.淺拷貝

  • copy/mutableCopy NSString
NSString *string = @"漢斯哈哈哈";
// 沒(méi)有產(chǎn)生新對(duì)象
NSString *copyString = [string copy];
// 產(chǎn)生新對(duì)象
NSMutableString *mutableCopyString = [string mutableCopy];

NSLog(@"string = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);
  • copy/mutableCopy NSMutableString
NSMutableString *string = [NSMutableString stringWithString:@"漢斯哈哈哈"];

// 產(chǎn)生新對(duì)象
NSString *copyString = [string copy];
// 產(chǎn)生新對(duì)象
NSMutableString *mutableCopyString = [string mutableCopy];

NSLog(@"string = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);

結(jié)論:

注意:其他對(duì)象NSArray铐望、NSMutableArray 、NSDictionary撑蒜、NSMutableDictionary一樣適用


  • copy NSObject
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;

HSPerson *copyP = [p copy]; // 這里崩潰

崩潰:


看崩潰信息HSPerson應(yīng)該先實(shí)現(xiàn):

- (id)copyWithZone:(NSZone *)zone;

測(cè)試:

#import "HSPerson.h"

@interface HSPerson()<NSCopying>

@end

@implementation HSPerson

- (id)copyWithZone:(NSZone *)zone
{

    return @"漢斯哈哈哈";
}

@end
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;

HSPerson *copyP = [p copy];
NSLog(@"copyP: %@", copyP);

可以看出copyWithZone重新分配新的內(nèi)存空間逞姿,則:

- (id)copyWithZone:(NSZone *)zone
{
    HSPerson *person = [[HSPerson allocWithZone:zone] init];
    return person;

// 有些人可能下面alloc,重新初始化空間免钻,但這方法已給你分配了zone糯彬,自己就無(wú)需再次alloc內(nèi)存空間了
//    HSPerson *person = [[HSPerson alloc] init];
}
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;

HSPerson *copyP = [p copy];
NSLog(@"p = %p copyP = %p", p, copyP);

NSLog(@"age = %d height = %f", copyP.age, copyP.height);

雖然copy了份新的對(duì)象纽乱,然而age,height值并未copy薪前,那么:

- (id)copyWithZone:(NSZone *)zone
{
    HSPerson *person = [[HSPerson allocWithZone:zone] init];
    person.age = self.age;
    person.height = self.height;
    // 這里self其實(shí)就要被copy的那個(gè)對(duì)象润努,很顯然要自己賦值給新對(duì)象,所以這里可以控制copy的屬性
    return person;
}

這時(shí)你會(huì)想示括,有NSMutableCopying?沒(méi)錯(cuò)痢畜,是有這貨:

- (id)mutableCopyWithZone:(NSZone *)zone
{
    HSPerson *person = [[HSPerson allocWithZone:zone] init];
    person.age = self.age;
    person.height = self.height;

    return person;
}

NSCopying垛膝、NSMutableCopying有啥區(qū)別?
其實(shí)感覺(jué)沒(méi)必要有NSMutableCopying丁稀,因?yàn)閴焊蜎](méi)可變的HSPerson吼拥,但如果該對(duì)象有其他行為,可以借用NSMutableCopying實(shí)現(xiàn)线衫,哈哈哈

property里的copy凿可、strong區(qū)別

說(shuō)完深淺拷貝,理解property里的copy授账、strong就輕松多了枯跑!

  • copy
#import <Foundation/Foundation.h>

@interface HSPerson : NSObject

@property (nonatomic, copy) NSString *name;

@end

NSMutableString *string = [NSMutableString stringWithFormat:@"漢斯哈哈哈"];

HSPerson *person = [[HSPerson alloc] init];
person.name = string;

// 不能改變person.name的值,因?yàn)槠鋬?nèi)部copy新的對(duì)象
[string appendString:@" hans"];

 NSLog(@"name = %@", person.name);

property copy 實(shí)際上就對(duì)name干了這個(gè):

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

假設(shè)name為NSMutableString白热,會(huì)發(fā)生什么事敛助?

@property (nonatomic, copy) NSMutableString *name;

這樣會(huì)挨罵哦,實(shí)際上內(nèi)部還是:

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

copy出來(lái)的仍然是不可變字符屋确!如果有人用NSMutableString的方法纳击,就會(huì)崩潰:

  • strong
@property (nonatomic, strong) NSString *name;
NSMutableString *string = [NSMutableString stringWithFormat:@"漢斯哈哈哈"];

HSPerson *person = [[HSPerson alloc] init];
person.name = string;

// 可以改變person.name的值续扔,因?yàn)槠鋬?nèi)部沒(méi)有生成新的對(duì)象
[string appendString:@" hans"];

NSLog(@"name = %@", person.name);

文章同步到微信公眾號(hào):hans_iOS 有疑問(wèn)可以在公眾號(hào)里直接發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焕数,隨后出現(xiàn)的幾起案子纱昧,更是在濱河造成了極大的恐慌,老刑警劉巖堡赔,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件识脆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡加匈,警方通過(guò)查閱死者的電腦和手機(jī)存璃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雕拼,“玉大人纵东,你說(shuō)我怎么就攤上這事∩犊埽” “怎么了偎球?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辑甜。 經(jīng)常有香客問(wèn)我衰絮,道長(zhǎng),這世上最難降的妖魔是什么磷醋? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任猫牡,我火速辦了婚禮,結(jié)果婚禮上邓线,老公的妹妹穿的比我還像新娘淌友。我一直安慰自己,他們只是感情好骇陈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布震庭。 她就那樣靜靜地躺著,像睡著了一般你雌。 火紅的嫁衣襯著肌膚如雪器联。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天婿崭,我揣著相機(jī)與錄音拨拓,去河邊找鬼。 笑死逛球,一個(gè)胖子當(dāng)著我的面吹牛千元,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颤绕,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼幸海,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祟身!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起物独,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袜硫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挡篓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婉陷,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年官研,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秽澳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戏羽,死狀恐怖担神,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情始花,我是刑警寧澤妄讯,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站酷宵,受9級(jí)特大地震影響亥贸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浇垦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一炕置、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧男韧,春花似錦讹俊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厕倍。三九已至寡壮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讹弯,已是汗流浹背况既。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留组民,地道東北人棒仍。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像臭胜,于是被迫代替她去往敵國(guó)和親莫其。 傳聞我的和親對(duì)象是個(gè)殘疾皇子癞尚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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