最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解iOS的深淺拷貝

 更新時間:2016年08月02日 11:35:02   作者:西木柚子  
本文詳細介紹了IOS中的三種拷貝方式,對iOS的深淺拷貝有疑問的朋友們可以參考下本文。

前言

OC對象的三種拷貝方式

OC的對象拷貝有如下三種方式,很多時候我們把深復制和完全復制混為一談,其他他們是有區(qū)別的,具體如下

淺復制(shallow copy):在淺復制操作時,對于被復制對象的每一層都是指針復制。

深復制(one-level-deep copy):在深復制操作時,對于被復制對象,至少有一層是深復制。

完全復制(real-deep copy):在完全復制操作時,對于被復制對象的每一層都是對象復制。

兩圖以避之


理解深復制(mutableCopy)

淺復制很簡單,就不演示了,看上面的圖就懂了,只是簡單的指針拷貝,所以改變原對象或者拷貝后的對象,都會影響另外一個對象。

從上圖我們可以看到mutableCopy對于任何對象都是內容復制,也就是說進行了深復制。

上代碼:

  NSMutableArray * dataArray1=[NSMutableArray arrayWithObjects:
                [NSMutableString stringWithString:@"1"],
                [NSMutableString stringWithString:@"2"],
                [NSMutableString stringWithString:@"3"],
                [NSMutableString stringWithString:@"4"],
                nil

                ];
  NSMutableArray * dataArray2=[NSMutableArray arrayWithObjects:
                [NSMutableString stringWithString:@"one"],
                [NSMutableString stringWithString:@"two"],
                [NSMutableString stringWithString:@"three"],
                [NSMutableString stringWithString:@"four"],
                dataArray1,
                nil
                ];

  NSMutableArray * dataArray3;
  NSMutableString * mStr;

  dataArray3=[dataArray2 mutableCopy];

  mStr = dataArray2[0];
  [mStr appendString:@"--ONE"];

  NSLog(@"dataArray3:%@",dataArray3);
  NSLog(@"dataArray2:%@",dataArray2);

輸出如下:

2016-07-31 17:40:30.702 test1[2113:169774] dataArray3:(
  "one--ONE",
  two,
  three,
  four,
    (
    1,
    2,
    3,
    4
  )
)
2016-07-31 17:40:30.703 test1[2113:169774] dataArray2:(
  "one--ONE",
  two,
  three,
  four,
    (
    1,
    2,
    3,
    4
  )
)

看上面的輸出,我們發(fā)現(xiàn)我們改變原數(shù)組dataArray2,竟然也會影響深復制后的dataArray3,不是說好的內容復制嗎,為什么會這樣?

這里我們來說說深復制和完全復制的區(qū)別

我們知道深復制,就是把原有對象的內容直接克隆一份到新對象,但是這里有一個坑就是他只會復制一層對象,而不會復制第二層甚至更深層次的對象。

代碼dataArray3=[dataArray2 mutableCopy];只是對數(shù)組dataArray2本身進行了內容拷貝,但是里面的字符串對象卻沒有進行內容拷貝,而是進行的淺復制,那么dataArray2dataArray3里面的對象是共享同一份的。所以才會出現(xiàn)上面的情況。

單層深復制

那么如何解決上面的問題呢?

可以使用如下代碼

  dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];

輸出如下:

2016-07-31 17:45:48.472 test1[2151:173221] dataArray3:(
  one,
  two,
  three,
  four,
    (
    1,
    2,
    3,
    4
  )
)
2016-07-31 17:45:48.472 test1[2151:173221] dataArray2:(
  "one--ONE",
  two,
  three,
  four,
    (
    1,
    2,
    3,
    4
  )
)

可以看到dataArray3并沒有被改變,但是別高興的太早,我們再來改改。

代碼如下:

  NSMutableArray * dataArray1=[NSMutableArray arrayWithObjects:
                [NSMutableString stringWithString:@"1"],
                [NSMutableString stringWithString:@"2"],
                [NSMutableString stringWithString:@"3"],
                [NSMutableString stringWithString:@"4"],
                nil

                ];
  NSMutableArray * dataArray2=[NSMutableArray arrayWithObjects:
                [NSMutableString stringWithString:@"one"],
                [NSMutableString stringWithString:@"two"],
                [NSMutableString stringWithString:@"three"],
                [NSMutableString stringWithString:@"four"],
                dataArray1,
                nil
                ];

  NSMutableArray * dataArray3;
  NSMutableString * mStr;

  dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];

  NSMutableArray *mArr = (NSMutableArray *)dataArray2[4];
  mStr = mArr[0];
  [mStr appendString:@"--ONE"];

  NSLog(@"dataArray3:%@",dataArray3);
  NSLog(@"dataArray2:%@",dataArray2);

輸出如下:

2016-07-31 17:47:19.421 test1[2174:174714] dataArray3:(
  one,
  two,
  three,
  four,
    (
    "1--ONE",
    2,
    3,
    4
  )
)
2016-07-31 17:47:19.421 test1[2174:174714] dataArray2:(
  one,
  two,
  three,
  four,
    (
    "1--ONE",
    2,
    3,
    4
  )
)

可以看到深復制又失效了,這是因為dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];僅僅能進行一層深復制,對于第二層或者更多層的就無效了,那怎么辦呢?

別急,我們還有大招沒放。

完全復制

要想對多層集合對象進行復制,我們需要進行完全復制,這里可以使用歸檔和接檔。

實現(xiàn)代碼如下:

  dataArray3 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:dataArray2]];

此時輸出如下:

2016-07-31 17:49:55.561 test1[2202:177163] dataArray3:(
  one,
  two,
  three,
  four,
    (
    1,
    2,
    3,
    4
  )
)
2016-07-31 17:49:55.562 test1[2202:177163] dataArray2:(
  one,
  two,
  three,
  four,
    (
    "1--ONE",
    2,
    3,
    4
  )
)

可以看到dataArray3沒有被dataArray2的修改影響。

類復制

說完了對象的復制,我們來看看如何實現(xiàn)類的復制,因為比較簡單,直接放上代碼

定義類復制

#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying>
@property(strong,nonatomic)NSString *age;
@property(strong,nonatomic)NSString *name;
@end
#import "Person.h"
@implementation Person
- (id)copyWithZone:(NSZone *)zone
{
  Person *person = [[Person allocWithZone:zone] init];
  person.age = self.age;
  person.name = self.name;
  return person;
}
@end

調用

  Person *person = [[Person alloc]init];
    person.age = @"dsdsd";
    person.name = @"dsdsdddww";

    Person *copyPerson = [person copy];
    NSLog(@"%@-----%@",copyPerson.age, copyPerson.name);

可以看到copyPerson的兩個屬性和persona一樣。

@property中的copy關鍵字

在設置NSString類型的屬性的時候,我們最好設置為copy類型,這樣別人使用我們定義的屬性的時候,他不管怎么改動該屬性的賦值,都不會影響我們給該屬性賦的值,為什么呢?

下面我們來看看


如上圖所示,string2的屬性是copy類型,可以看到是無法被修改的。

因為此時string2copystring的內存地址不一樣,修改一個,不會影響另外一個。


上圖所示,如果string2的屬性是strong類型,就可以被修改,如下圖所示:

因為此時string2copystring的內存地址都是一樣的,修改一個,兩個就同時被修改

copy關鍵字的NSMutableString崩潰

原因:

copy關鍵字的stringsetter方法實際上是把參數(shù)copy之后再賦值給變量_string,那么此時變量_string雖然被申明為NSMutableString,但是copy之后,就把 變量_string變成了不可變的NSString類型,所以就會出現(xiàn)方法報錯,提示對不可變的NSString使用了NSMutableString的方法appendString。

總結

以上就是iOS的深淺拷貝的詳細內容,希望本文在大家開發(fā)iOS的過程中能有所幫助。

相關文章

  • iOS中SQLite使用教程

    iOS中SQLite使用教程

    sqlite是嵌入式的和輕量級的sql數(shù)據(jù)庫。sqlite是由c實現(xiàn)的。廣泛用于包括瀏覽器(支持html5的大部分瀏覽器,ie除外)、ios、android以及一些便攜需求的小型web應用系統(tǒng)
    2016-03-03
  • iOS在固定的label上動態(tài)顯示所有文字

    iOS在固定的label上動態(tài)顯示所有文字

    這篇文章給大家主要介紹了iOS中如何實現(xiàn),在固定的label上動態(tài)顯示所有文字的方法,文中給出了示例和思路,對大家的理解很有幫助,感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • IOS上iframe的滾動條失效的解決辦法

    IOS上iframe的滾動條失效的解決辦法

    這篇文章主要為大家詳細介紹了IOS上iframe的滾動條失效的解決辦法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS實現(xiàn)聊天輸入框功能

    iOS實現(xiàn)聊天輸入框功能

    大家都經常使用微信聊天功能,在沒事的時候就會想微信聊天輸入框的實現(xiàn)過程,很無聊吧。今天小編抽空給大家分享iOS實現(xiàn)聊天輸入框功能,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-02-02
  • 解決SDK注入權限驗證安卓正常,IOS出現(xiàn)config fail的方法

    解決SDK注入權限驗證安卓正常,IOS出現(xiàn)config fail的方法

    這篇文章主要介紹了解決SDK注入權限驗證安卓正常,IOS出現(xiàn)config fail的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • scrollview tableView嵌套解決方案示例

    scrollview tableView嵌套解決方案示例

    這篇文章主要介紹了scrollview tableView嵌套解決方案示例的代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • NSString屬性何時用strong何時用copy?

    NSString屬性何時用strong何時用copy?

    相信各位iOS開發(fā)者們都考慮過這個問題,平時寫NSString的屬性時都用copy,那strong要何時用呢?下面這篇文章就來看一下什么時候應該用copy,什么時候應該用strong。有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • iOS如何利用一句話完成轉場動畫

    iOS如何利用一句話完成轉場動畫

    這篇文章主要給大家介紹了關于iOS如何利用一句話完成轉場動畫的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • iOS實現(xiàn)波浪效果

    iOS實現(xiàn)波浪效果

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)波浪效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • IOS React Native FlexBox詳解及實例

    IOS React Native FlexBox詳解及實例

    這篇文章主要介紹了IOS React Native FlexBox詳解的相關資料,并附實例代碼,需要的朋友可以參考下
    2016-11-11

最新評論

安多县| 沾益县| 社旗县| 积石山| 嘉义市| 土默特左旗| 乌什县| 正阳县| 黔东| 南郑县| 安龙县| 平远县| 安顺市| 壤塘县| 玉溪市| 彩票| 无棣县| 文水县| 烟台市| 华池县| 汕尾市| 瑞金市| 桐柏县| 北碚区| 安西县| 翼城县| 陆河县| 乌海市| 彰化县| 子洲县| 剑川县| 大埔县| 镇宁| 沁阳市| 曲阳县| 尼勒克县| 麦盖提县| 应用必备| 屏山县| 台南市| 贡觉县|