iOS 關(guān)于容器類的淺额衙、深拷貝探究

引子

淺拷貝:指針拷貝创千,引用拷貝缰雇,指向同一內(nèi)存地址

深拷貝:內(nèi)容拷貝,指向不同內(nèi)存地址追驴,但是內(nèi)容相同

容器類拷貝的誤解

針對(duì)NSArray械哟,copy是淺拷貝,mutableCopy是深拷貝

針對(duì)NSMutableArray殿雪,copy是深拷貝暇咆,mutableCopy是深拷貝

舉例說(shuō)明:

NSArray的拷貝

NSArray *itemsOrigin = @[@"apple",@"pear"];
NSArray *items_copy = itemsOrigin.copy;
NSArray *items_mutableCopy = itemsOrigin.mutableCopy;
NSLog(@"原始數(shù)組地址:%p",itemsOrigin);
NSLog(@"copy數(shù)組地址:%p",items_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",items_mutableCopy);

輸出的內(nèi)存地址:

結(jié)果

看來(lái)似乎沒什么問題,copy后的數(shù)組指向同一內(nèi)存地址丙曙,mutableCopy產(chǎn)生新的內(nèi)存地址

NSMutableArray的拷貝

NSMutableArray *mutableItemsOrigin = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];
NSArray *mutableItems_copy = mutableItemsOrigin.copy;
NSMutableArray *mutableItems_mutableCopy = mutableItemsOrigin.mutableCopy;
NSLog(@"原始數(shù)組地址:%p",mutableItemsOrigin);
NSLog(@"copy數(shù)組地址:%p",mutableItems_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",mutableItems_mutableCopy);

輸出的內(nèi)存地址:

結(jié)果

這和誤解中說(shuō)的一致爸业,針對(duì)NSMutableArray,copy是深拷貝亏镰,mutableCopy是深拷貝

但是我們不要忘了扯旷,深拷貝的意義在于,內(nèi)容完全的復(fù)制索抓,解決引用的問題钧忽,當(dāng)我們改變其中一個(gè)元素時(shí),相互不會(huì)影響

這里有人會(huì)反駁了逼肯,我改變了元素耸黑,的確不會(huì)影響到復(fù)制的數(shù)組,就像下面這樣:

// 改變?cè)紨?shù)組
[mutableItemsOrigin addObject:@"banana"];
// 改變mutableCopy數(shù)組
[mutableItems_mutableCopy addObject:@"grape"];
NSLog(@"原始數(shù)組元素:%@",mutableItemsOrigin);
NSLog(@"mutableCopy數(shù)組元素:%@",mutableItems_mutableCopy);

輸出:

結(jié)果

似乎沒啥問題篮幢,確實(shí)相互不會(huì)影響大刊,說(shuō)到這里,有人可能會(huì)大罵LZSB三椿!

那是不是筆者嘩眾取寵了呢缺菌?回答是NO,讓筆者一步步揭開容器類真正的深拷貝


首先搜锰,我們回到最初的數(shù)組男翰,輸出它們的內(nèi)存地址

NSMutableArray *mutableItemsOrigin = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];
NSArray *mutableItems_copy = mutableItemsOrigin.copy;
NSMutableArray *mutableItems_mutableCopy = mutableItemsOrigin.mutableCopy;
NSLog(@"原始數(shù)組地址:%p",mutableItemsOrigin);
NSLog(@"copy數(shù)組地址:%p",mutableItems_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",mutableItems_mutableCopy);
        
NSLog(@"\n");
for (NSString *itemString in mutableItemsOrigin) {
    NSLog(@"原始數(shù)組元素地址:%p",itemString);
}
for (NSString *itemString in mutableItems_copy) {
    NSLog(@"copy數(shù)組元素地址:%p",itemString);
}
for (NSString *itemString in mutableItems_mutableCopy) {
    NSLog(@"mutableCopy數(shù)組元素地址:%p",itemString);
}

輸出元素內(nèi)存地址:

結(jié)果

由上圖可知,容器數(shù)組無(wú)論是copy還是mutableCopy纽乱,元素指向了相同的內(nèi)存地址蛾绎;由此可知,兩種拷貝方式僅僅產(chǎn)生了兩個(gè)內(nèi)存地址不同的容器鸦列,它們的使用的是同一份元素

那為什么內(nèi)容不相互影響呢租冠?接著往下看
我們?yōu)樵紨?shù)組新增一個(gè)元素,mutableCopy的數(shù)組作刪除一個(gè)元素操作

// 改變?cè)紨?shù)組 -- 新增
[mutableItemsOrigin addObject:@"banana"];
// 改變mutableCopy數(shù)組 -- 刪除
[mutableItems_mutableCopy removeLastObject];
NSLog(@"原始數(shù)組元素:%@",mutableItemsOrigin);
NSLog(@"mutableCopy數(shù)組元素:%@",mutableItems_mutableCopy);
NSLog(@"\n");
for (NSString *itemString in mutableItemsOrigin) {
    NSLog(@"原始數(shù)組元素地址:%p",itemString);
}
for (NSString *itemString in mutableItems_mutableCopy) {
    NSLog(@"mutableCopy數(shù)組元素地址:%p",itemString);
}

輸出:

結(jié)果

由上圖可知:

1薯嗤、原始數(shù)組新增了一個(gè)內(nèi)存地址為:0x100002130顽爹,內(nèi)容為banana的元素,mutableCopy數(shù)組只剩內(nèi)存地址為0x100002090骆姐,內(nèi)容為apple的元素

2、原始數(shù)組和mutableCopy數(shù)組確實(shí)沒有相互影響


原因解析

最初的時(shí)候

結(jié)果

當(dāng)我們操作數(shù)組中的元素時(shí)(原始數(shù)組新增一個(gè)元素,mutableCopy的數(shù)組作刪除一個(gè)元素操作)缝裤,會(huì)發(fā)生如下變化

結(jié)果

上圖可以看出,原始數(shù)組多出了一個(gè)“banana”的元素公荧,而可變數(shù)組被刪除了“pear”元素,指向“pear”元素的指針被移除了


過(guò)程雖然如此同规,但是并沒有影響到我們使用循狰,那我們是不是忽略其非深拷貝到事實(shí)了呢?錯(cuò)券勺,我們要知道绪钥,上述的例子中,元素都是不可變的关炼,當(dāng)我們操作時(shí)程腹,都是操作了整個(gè)元素地址,要么被刪除(指針)儒拂,要么新增元素(新地址)寸潦,假如元素是可變的,我們只操作元素的子元素會(huì)發(fā)生什么呢侣灶?


重點(diǎn):操作可變數(shù)組可變?cè)?/strong>

我們將元素定義為可變的

// 定義一個(gè)可變?cè)財(cái)?shù)組
NSMutableArray *items = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];
// 新建原始數(shù)組
NSMutableArray *mutableItemsOrigin = [NSMutableArray arrayWithObject:items];
// copy該數(shù)組
NSArray *mutableItems_copy = mutableItemsOrigin.copy;
// mutableCopy該數(shù)組
NSMutableArray *mutableItems_mutableCopy = mutableItemsOrigin.mutableCopy;
NSLog(@"原始數(shù)組地址:%p",mutableItemsOrigin);
NSLog(@"copy數(shù)組地址:%p",mutableItems_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",mutableItems_mutableCopy);
// 輸出元素的內(nèi)存地址
NSLog(@"\n");
for (NSMutableArray *items in mutableItemsOrigin) {
    for (NSString *itemString in items) {
        NSLog(@"原始數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_copy) {
    for (NSString *itemString in items) {
        NSLog(@"copy數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_mutableCopy) {
    for (NSString *itemString in items) {
        NSLog(@"mutableCopy數(shù)組元素地址:%p",itemString);
    }
}

輸出內(nèi)存地址:

結(jié)果

由上圖可知:同樣的甸祭,NSMutableArray數(shù)組的copy和mutableCopy都會(huì)產(chǎn)生內(nèi)存地址不同容器缕碎,但是元素依舊引用了同一份褥影,屬于淺拷貝

接下來(lái),我們來(lái)改變其中可變?cè)?/p>

// 改變?cè)紨?shù)組 -- 新增
NSMutableArray *tmpItemsOrigin = mutableItemsOrigin.firstObject;
[tmpItemsOrigin addObject:@"banana"];
// 改變mutableCopy數(shù)組 -- 新增
NSMutableArray *tmpItems_mutableCopy = mutableItems_mutableCopy.firstObject;
[tmpItems_mutableCopy addObject:@"watermelon"];
NSLog(@"原始數(shù)組元素:%@",mutableItemsOrigin.firstObject);
NSLog(@"copy數(shù)組元素:%@",mutableItems_copy.firstObject);
NSLog(@"mutableCopy數(shù)組元素:%@",mutableItems_mutableCopy.firstObject);

for (NSMutableArray *items in mutableItemsOrigin) {
    for (NSString *itemString in items) {
        NSLog(@"原始數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_copy) {
    for (NSString *itemString in items) {
        NSLog(@"copy數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_mutableCopy) {
    for (NSString *itemString in items) {
        NSLog(@"mutableCopy數(shù)組元素地址:%p",itemString);
    }
}

輸出結(jié)果:

結(jié)果

我們看到咏雌,上述操作凡怎,無(wú)論是原始數(shù)組的新增,還是mutableCopy數(shù)組的新增都會(huì)相互影響赊抖,不僅如此统倒,copy出來(lái)的不可變數(shù)組也被改變了!氛雪!

這種結(jié)果再次說(shuō)明房匆,容器類的復(fù)制,無(wú)論是copy還是mutableCopy报亩,如果僅僅做一次拷貝就是淺拷貝T『琛!弦追!



接下來(lái)岳链,我們來(lái)看下系統(tǒng)的一個(gè)方法,拷貝元素

- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag

這個(gè)方法是將items拷貝(copy)一份劲件,不可變?cè)貫闇\拷貝掸哑,可變?cè)貏t為深拷貝容器

1约急、items為NSArray

MutableArray *mutableItemsOrigin = [NSMutableArray arrayWithObject:@[@"apple",@"pear"]];
NSArray *mutableItems_copy = [[NSArray alloc] initWithArray:mutableItemsOrigin copyItems:YES];
NSMutableArray *mutableItems_mutableCopy = [[NSMutableArray alloc] initWithArray:mutableItemsOrigin copyItems:YES];
NSLog(@"原始數(shù)組地址:%p",mutableItemsOrigin);
NSLog(@"copy數(shù)組地址:%p",mutableItems_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",mutableItems_mutableCopy);

NSLog(@"\n");
NSLog(@"原始數(shù)組元素地址:%p",mutableItemsOrigin.firstObject);
NSLog(@"copy數(shù)組元素地址:%p",mutableItems_copy.firstObject);
NSLog(@"mutableCopy數(shù)組元素地址:%p",mutableItems_mutableCopy.firstObject);

結(jié)果:元素的內(nèi)存地址不變

結(jié)果

2、items為NSMutableArray

MutableArray *items = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];

NSMutableArray *mutableItemsOrigin = [NSMutableArray arrayWithObject:items];
NSArray *mutableItems_copy = [[NSArray alloc] initWithArray:mutableItemsOrigin copyItems:YES];
NSMutableArray *mutableItems_mutableCopy = [[NSMutableArray alloc] initWithArray:mutableItemsOrigin copyItems:YES];
NSLog(@"原始數(shù)組地址:%p",mutableItemsOrigin);
NSLog(@"copy數(shù)組地址:%p",mutableItems_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",mutableItems_mutableCopy);

NSLog(@"\n");
NSLog(@"原始數(shù)組元素地址:%p",mutableItemsOrigin.firstObject);
NSLog(@"copy數(shù)組元素地址:%p",mutableItems_copy.firstObject);
NSLog(@"mutableCopy數(shù)組元素地址:%p",mutableItems_mutableCopy.firstObject);

結(jié)果:元素變?yōu)椴豢勺償?shù)組苗分,內(nèi)存地址改變

結(jié)果

這樣厌蔽,我們來(lái)重復(fù)之前的例子

MutableArray *items = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];

NSMutableArray *mutableItemsOrigin = [NSMutableArray arrayWithObject:items];
NSArray *mutableItems_copy = [[NSArray alloc] initWithArray:mutableItemsOrigin copyItems:YES];
NSMutableArray *mutableItems_mutableCopy = [[NSMutableArray alloc] initWithArray:mutableItemsOrigin copyItems:YES];
NSLog(@"原始數(shù)組地址:%p",mutableItemsOrigin);
NSLog(@"copy數(shù)組地址:%p",mutableItems_copy);
NSLog(@"mutableCopy數(shù)組地址:%p",mutableItems_mutableCopy);

NSLog(@"\n");
// 輸出元素地址
NSLog(@"原始數(shù)組元素地址:%p",mutableItemsOrigin.firstObject);
NSLog(@"copy數(shù)組元素地址:%p",mutableItems_copy.firstObject);
NSLog(@"mutableCopy數(shù)組元素地址:%p",mutableItems_mutableCopy.firstObject);
// 輸出最小元素地址
for (NSMutableArray *items in mutableItemsOrigin) {
    for (NSString *itemString in items) {
        NSLog(@"原始數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_copy) {
    for (NSString *itemString in items) {
        NSLog(@"copy數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_mutableCopy) {
    for (NSString *itemString in items) {
        NSLog(@"mutableCopy數(shù)組元素地址:%p",itemString);
    }
}

結(jié)果:

結(jié)果

我們發(fā)現(xiàn):

1、使用了copyItems函數(shù)后俭嘁,產(chǎn)生了新的元素容器躺枕,但是最小元素的內(nèi)存地址依舊是一份

2、可變?cè)財(cái)?shù)組由于該函數(shù)供填,變?yōu)榱瞬豢勺償?shù)組

3拐云、最小單位的元素依舊指向同一份地址

這時(shí),由于元素?cái)?shù)組內(nèi)存地址已經(jīng)不同近她,我們操作原始數(shù)組時(shí)叉瘩,不會(huì)在影響到拷貝到數(shù)組

// 改變?cè)紨?shù)組 -- 新增
NSMutableArray *tmpItemsOrigin = mutableItemsOrigin.firstObject;
[tmpItemsOrigin addObject:@"banana"];
// 改變mutableCopy數(shù)組 -- 新增 -- 由于元素變?yōu)椴豢勺償?shù)組,所以不可像下面那樣操作
//NSMutableArray *tmpItems_mutableCopy = mutableItems_mutableCopy.firstObject;
//[tmpItems_mutableCopy addObject:@"watermelon"];
NSLog(@"原始數(shù)組元素:%@",mutableItemsOrigin.firstObject);
NSLog(@"copy數(shù)組元素:%@",mutableItems_copy.firstObject);
NSLog(@"mutableCopy數(shù)組元素:%@",mutableItems_mutableCopy.firstObject);

for (NSMutableArray *items in mutableItemsOrigin) {
    for (NSString *itemString in items) {
        NSLog(@"原始數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_copy) {
    for (NSString *itemString in items) {
        NSLog(@"copy數(shù)組元素地址:%p",itemString);
    }
}
for (NSMutableArray *items in mutableItems_mutableCopy) {
    for (NSString *itemString in items) {
        NSLog(@"mutableCopy數(shù)組元素地址:%p",itemString);
    }
}

結(jié)果:

結(jié)果

copy的數(shù)組和mutableCopy數(shù)組并未被影響

系統(tǒng)提供的這種方法只不過(guò)就是元素?cái)?shù)組copy一下粘捎,并將數(shù)組轉(zhuǎn)換為不可變數(shù)組NSArray薇缅,這時(shí)操作了整個(gè)不可變?cè)財(cái)?shù)組,這樣就避免了相互影響(和操作NSArray一樣)



綜上所述

1攒磨、copy和mutableCopy只能作單層拷貝泳桦,針對(duì)容器類僅僅使用一次拷貝操作時(shí),只能產(chǎn)生新的容器娩缰,但是元素共用一份

2灸撰、如果想要拷貝元素,則需要調(diào)用系統(tǒng)方法copyItems拼坎,將元素copy一份(這個(gè)元素copy也僅僅是單層拷貝)

3浮毯、如果是容器嵌套容器時(shí),單單使用一次copy或者mutableCopy泰鸡,嚴(yán)格意義上來(lái)說(shuō)债蓝,是無(wú)法做到深拷貝的,因?yàn)樵乜赡軟]有被拷貝盛龄,并且如果元素是不可變類型時(shí)饰迹,無(wú)論怎么樣做都只能是引用拷貝,因?yàn)樽钚≡厥遣豢勺兊挠嗖埃瑑H僅有一份內(nèi)存地址

4啊鸭、因此非容器類,如NSString欧芽,NSMutableString等莉掂,copy和mutableCopy作單層拷貝就達(dá)到了最終效果


驗(yàn)證

情況1:非容器類,不可變類型

NSString *string = @"LOLITA64";
NSString *string_copy = string.copy;
NSMutableString *string_mutableCopy = string.mutableCopy;
NSLog(@"string地址:%p",string);
NSLog(@"string_copy地址:%p",string_copy);
NSLog(@"string_mutableCopy地址:%p",string_mutableCopy);
[string_mutableCopy appendString:@"-test"];
NSLog(@"原始字符串:%@",string);
NSLog(@"string_copy字符串:%@",string_copy);
NSLog(@"string_mutableCopy字符串:%@",string_mutableCopy);

輸出:

結(jié)果

結(jié)論:copy為淺拷貝千扔,mutableCopy為深拷貝


情況2:非容器類憎妙,可變類型

NSString *string = [NSMutableString stringWithString:@"LOLITA64"];
NSString *string_copy = string.copy;
NSMutableString *string_mutableCopy = string.mutableCopy;
NSLog(@"string地址:%p",string);
NSLog(@"string_copy地址:%p",string_copy);
NSLog(@"string_mutableCopy地址:%p",string_mutableCopy);
[string_mutableCopy appendString:@"-test"];
NSLog(@"原始字符串:%@",string);
NSLog(@"string_copy字符串:%@",string_copy);
NSLog(@"string_mutableCopy字符串:%@",string_mutableCopy);

輸出:

結(jié)果

結(jié)論:copy為深拷貝库正,mutableCopy為深拷貝


情況3:容器類(單層),不可變類型厘唾,元素不可變非容器褥符,單次拷貝

NSArray *items = @[@"apple",@"pear"];
NSArray *items_copy = items.copy;
NSMutableArray *items_mutableCopy = items.mutableCopy;
NSLog(@"items地址:%p",items);
NSLog(@"items_copy地址:%p",items_copy);
NSLog(@"items_mutableCopy地址:%p",items_mutableCopy);
for (NSString *itemString in items) {
    NSLog(@"items不可變?cè)氐刂罚?p",itemString);
}
for (NSString *itemString in items_copy) {
    NSLog(@"items_copy不可變?cè)氐刂罚?p",itemString);
}
for (NSString *itemString in items_mutableCopy) {
    NSLog(@"items_mutableCopy不可變?cè)氐刂罚?p",itemString);
}

輸出:

結(jié)果

結(jié)論:copy不產(chǎn)生新容器,mutableCopy產(chǎn)生新容器抚垃,但是最小元素內(nèi)存地址都一樣喷楣,淺拷貝


情況4:容器類(單層),不可變類型鹤树,元素不可變非容器铣焊,元素拷貝

// 更改
NSArray *items_copy = [[NSArray alloc] initWithArray:items copyItems:YES];
NSMutableArray *items_mutableCopy = [[NSMutableArray alloc] initWithArray:items copyItems:YES];

輸出:

結(jié)果

結(jié)論:產(chǎn)生新容器,但是最小元素內(nèi)存地址都一樣罕伯,淺拷貝


情況5:容器類(單層)曲伊,不可變類型,元素可變非容器追他,單次拷貝

NSMutableString *string1 = [NSMutableString stringWithString:@"apple"];
NSMutableString *string2 = [NSMutableString stringWithString:@"pear"];
NSArray *items = @[string1,string2];
NSArray *items_copy = items.copy;
NSMutableArray *items_mutableCopy = items.mutableCopy;

結(jié)果:

結(jié)果

結(jié)論:copy不產(chǎn)生新容器坟募,mutableCopy產(chǎn)生新容器,但是最小元素內(nèi)存地址都一樣邑狸,淺拷貝


情況6:容器類(單層)懈糯,不可變類型,元素可變非容器单雾,元素拷貝

NSArray *items_copy = [[NSArray alloc] initWithArray:items copyItems:YES];
NSMutableArray *items_mutableCopy = [[NSMutableArray alloc] initWithArray:items copyItems:YES];

輸出:

結(jié)果

結(jié)論:產(chǎn)生新容器赚哗,最小元素內(nèi)存地址不一樣,深拷貝


情況7:容器類(單層)铁坎,可變類型蜂奸,元素不可變非容器犁苏,單次拷貝

NSMutableArray *items = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];
NSArray *items_copy = items.copy;
NSMutableArray *items_mutableCopy = items.mutableCopy;

輸出:

結(jié)果

結(jié)論:copy硬萍、mutableCopy都產(chǎn)生新容器,但是最小元素內(nèi)存地址都一樣围详,淺拷貝


情況8:容器類(單層)朴乖,可變類型,元素不可變助赞,元素拷貝

NSMutableArray *items = [NSMutableArray arrayWithArray:@[@"apple",@"pear"]];
NSArray *items_copy = [[NSArray alloc] initWithArray:items copyItems:YES];
NSMutableArray *items_mutableCopy = [[NSMutableArray alloc] initWithArray:items copyItems:YES];

輸出:

結(jié)果

結(jié)論:copy买羞、mutableCopy都產(chǎn)生新容器,但是最小元素內(nèi)存地址都一樣雹食,淺拷貝


情況9:容器類(單層)畜普,可變類型,元素可變群叶,單次拷貝

NSMutableString *string1 = [NSMutableString stringWithString:@"apple"];
NSMutableString *string2 = [NSMutableString stringWithString:@"pear"];
NSMutableArray *items = [NSMutableArray arrayWithArray:@[string1,string2]];
NSArray *items_copy = items.copy;
NSMutableArray *items_mutableCopy = items.mutableCopy;

輸出:

結(jié)果

結(jié)論:copy吃挑、mutableCopy都產(chǎn)生新容器钝荡,但是最小元素內(nèi)存地址都一樣,淺拷貝


情況10:容器類(單層)舶衬,可變類型埠通,元素可變,元素拷貝

NSArray *items_copy = [[NSArray alloc] initWithArray:items copyItems:YES];
NSMutableArray *items_mutableCopy = [[NSMutableArray alloc] initWithArray:items copyItems:YES];

輸出:

結(jié)果

結(jié)論:產(chǎn)生新容器逛犹,最小元素內(nèi)存地址不一樣端辱,深拷貝


情況11:容器類(多層,嵌套容器)

參考開始幾個(gè)例子


結(jié)論:

1虽画、容器類是否可以深拷貝舞蔽,首先要看最小元素,若最小元素為不可變類型码撰,容器類的任何拷貝操作都是淺拷貝

2喷鸽、如使用copyItems函數(shù),并且元素為可變類型時(shí)灸拍,可以連元素一起拷貝做祝,屬于深拷貝(元素非容器)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸡岗,隨后出現(xiàn)的幾起案子混槐,更是在濱河造成了極大的恐慌,老刑警劉巖轩性,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声登,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡揣苏,警方通過(guò)查閱死者的電腦和手機(jī)悯嗓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卸察,“玉大人脯厨,你說(shuō)我怎么就攤上這事】又剩” “怎么了合武?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涡扼。 經(jīng)常有香客問我稼跳,道長(zhǎng),這世上最難降的妖魔是什么吃沪? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任汤善,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘红淡。我一直安慰自己卸伞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布锉屈。 她就那樣靜靜地躺著荤傲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颈渊。 梳的紋絲不亂的頭發(fā)上遂黍,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音俊嗽,去河邊找鬼雾家。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绍豁,可吹牛的內(nèi)容都是我干的芯咧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼竹揍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敬飒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芬位,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤无拗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昧碉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體英染,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年被饿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了四康。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狭握,死狀恐怖闪金,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哥牍,我是刑警寧澤毕泌,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布喝检,位于F島的核電站嗅辣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挠说。R本人自食惡果不足惜澡谭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛙奖,春花似錦潘酗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至攒砖,卻和暖如春缸兔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吹艇。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惰蜜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人受神。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓抛猖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鼻听。 傳聞我的和親對(duì)象是個(gè)殘疾皇子财著,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 1、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制撑碴。顧名思義瓢宦,淺復(fù)制,并不拷貝對(duì)象本身灰羽,僅僅是拷貝指向?qū)ο蟮闹羔樛月模簧顝?fù)制是直接...
    滴答大閱讀 775評(píng)論 0 2
  • 導(dǎo)讀 最近經(jīng)常在關(guān)注的公眾號(hào)或者技術(shù)網(wǎng)站看到關(guān)于 iOS 深拷貝與淺拷貝的話題×溃看到一篇技術(shù)文章玫镐,點(diǎn)擊收藏或者只是...
    獨(dú)木舟的木閱讀 675評(píng)論 0 8
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 877評(píng)論 0 2
  • 轉(zhuǎn)載一、概念與總結(jié) 1怠噪、淺拷貝 淺拷貝就是對(duì)內(nèi)存地址的復(fù)制恐似,讓目標(biāo)對(duì)象指針和源對(duì)象指向同一片內(nèi)存空間,當(dāng)內(nèi)存銷毀的...
    ilmari閱讀 384評(píng)論 0 2
  • 1.下班后和同事一起去看了電影傍念,天才槍手矫夷,真的覺得特別的棒,完全進(jìn)入了劇情憋槐,作弊的事件拍出了諜戰(zhàn)片的感覺 2.叔的...
    萌椒妹閱讀 145評(píng)論 0 0