亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

NSString屬性何時(shí)用strong何時(shí)用copy?

 更新時(shí)間:2016年12月08日 10:43:52   投稿:daisy  
相信各位iOS開(kāi)發(fā)者們都考慮過(guò)這個(gè)問(wèn)題,平時(shí)寫(xiě)NSString的屬性時(shí)都用copy,那strong要何時(shí)用呢?下面這篇文章就來(lái)看一下什么時(shí)候應(yīng)該用copy,什么時(shí)候應(yīng)該用strong。有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。

前言

我們?cè)诼暶饕粋€(gè)NSString屬性時(shí),對(duì)于其內(nèi)存相關(guān)特性,通常有兩種選擇(基于A(yíng)RC環(huán)境):strong與copy。那這兩者有什么區(qū)別呢?什么時(shí)候該用strong,什么時(shí)候該用copy呢?讓我們先來(lái)看個(gè)例子。

代碼驗(yàn)證

@property (nonatomic, strong) NSString *myStrongString;
@property (nonatomic, copy) NSString *myCopyString;
- (void)stringTest {
 NSMutableString *mutableStr = [NSMutableString stringWithFormat:@"https://"];
 self.myStrongString = mutableStr;
 self.myCopyString = mutableStr;
 NSLog(@"mutableStr:%p,%p", mutableStr,&mutableStr);
 NSLog(@"strongString:%p,%p", _myStrongString, &_myStrongString);
 NSLog(@"copyString:%p,%p", _myCopyString, &_myCopyString);
 //---------------分割線(xiàn)--------------------- 
 [mutableStr appendString:@"devthinking.com"];
 NSLog(@"strongString:%p,%p", _myStrongString, &_myStrongString);
 NSLog(@"copyString:%p,%p", _myCopyString, &_myCopyString);
}

打印日志如下:

2016-11-09 14:14:18.532 DemoCollectOC[92929:1731791] mutableStr:0x60800026fe00,0x7fff549c9be8
2016-11-09 14:14:18.532 DemoCollectOC[92929:1731791] strongString:0x60800026fe00,0x7ff095402308
2016-11-09 14:14:18.533 DemoCollectOC[92929:1731791] copyString:0x6080004234a0,0x7ff095402310
2016-11-09 14:14:18.533 DemoCollectOC[92929:1731791] strongString:0x60800026fe00,0x7ff095402308
2016-11-09 14:14:21.039 DemoCollectOC[92929:1731791] copyString:0x6080004234a0,0x7ff095402310

結(jié)論

     1.myStrongString跟mutableStr的指向地址始終一樣,都為0x60800026fe00,myCopyString跟mutableStr指向的地址不同,即為深copy,新開(kāi)辟了一份內(nèi)存;

     2.賦值時(shí),當(dāng)原始字符串是mutable String時(shí),存在此差異,當(dāng)mutableStr變化時(shí),myStrongString會(huì)隨著改變,而myCopyString則不會(huì)。通常我們不想讓其隨著改變,故用copy屬性較多;如果我們想其隨著改變,則用strong。

     3. 如果原始賦值字符串為string時(shí),則用copy和strong屬性是一樣的。

變量存儲(chǔ)地址

  1. &取地址符,取出來(lái)的是變量的存儲(chǔ)地址,如myStrongString myCopyString是存在堆里的,地址以0x7ff09開(kāi)頭,mutableStr為臨時(shí)變量,是存在棧里的,以0x7fff5開(kāi)頭。
  2. 直接p打印出來(lái)的地址,則是存儲(chǔ)內(nèi)容實(shí)際存在的地址,其實(shí)里面存儲(chǔ)的還是地址,詳細(xì)的請(qǐng)看下一節(jié),但是我們可以用這個(gè)地址區(qū)間來(lái)判斷存儲(chǔ)的區(qū)域。

附:x/3gx查看對(duì)象內(nèi)存

查看基本數(shù)據(jù)類(lèi)型的內(nèi)存時(shí),可直接查看,16進(jìn)制轉(zhuǎn)化一下就可以,查看對(duì)象時(shí),則不可以,這跟String的結(jié)構(gòu)體是相關(guān)的:


以NSString為例

 NSString *str = @"a";

先打印出地址:

(lldb) p str
(__NSCFConstantString *) $0 = 0x0000000109b3aa30 @"a"

再用x/3gx命令查看內(nèi)存:

(lldb) x/3gx 0x0000000109b3aa30
0x109b3aa30: 0x000000010bf3e348 0x00000000000007c8
0x109b3aa40: 0x0000000109b276db

再查看0x0000000109b276db中的地址即為字母a的Ascii碼實(shí)際存在地址:

(lldb) p (char*)0x0000000109b276db
(char *) $2 = 0x0000000109b276db "a"

可以直接在變量上右鍵上打開(kāi)view memory of “*str”, 這就打開(kāi)memory查看,在A(yíng)ddress里面輸上0x0000000109b276db,即可查看每個(gè)字節(jié)的內(nèi)容。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)各位iOS開(kāi)發(fā)者們能有所幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論