成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS5 ARC學習筆記:strong、weak等詳解

移動開發 iOS
iOS5中加入了新知識,就是ARC,其實我并不是很喜歡它,因為習慣了自己管理內存。但是學習還是很有必要的?,F在我們看看iOS5中新的關鍵字strong, weak, unsafe_unretained. 可以與以前的關鍵字對應學習strong與retain類似,weak與unsafe_unretained功能差不多(有點區別,等下會介紹,這兩個新 關鍵字與assign類似)。在iOS5中用這些新的關鍵字,就可以不用手動管理內存了,從java等其它語言轉過來的程序員非常受用。

iOS5中加入了新知識,就是ARC,其實我并不是很喜歡它,因為習慣了自己管理內存。但是學習還是很有必要的。

在iOS開發過程中,屬性的定義往往與retain, assign, copy有關,我想大家都很熟悉了,在此我也不介紹,網上有很多相關文章。

現在我們看看iOS5中新的關鍵字strong, weak, unsafe_unretained. 可以與以前的關鍵字對應學習strong與retain類似,weak與unsafe_unretained功能差不多(有點區別,等下會介紹,這兩個新 關鍵字與assign類似)。在iOS5中用這些新的關鍵字,就可以不用手動管理內存了,從java等其它語言轉過來的程序員非常受用。

strong關鍵字與retain關似,用了它,引用計數自動+1,用實例更能說明一切

  1. @property (nonatomic, strong) NSString *string1;   
  2. @property (nonatomic, strong) NSString *string2;

有這樣兩個屬性

  1. @synthesize string1;   
  2. @synthesize string2; 

猜一下下面代碼將輸出什么結果?

  1. self.string1 = @"String 1";   
  2. [self.string2 = self.string1;   
  3. [self.string1 = nil;  
  4. [NSLog(@"String 2 = %@", self.string2); 

結果是:String 2 = String 1

由于string2是strong定義的屬性,所以引用計數+1,使得它們所指向的值都是@"String 1", 如果你對retain熟悉的話,這理解并不難。

接著我們來看weak關鍵字:

如果這樣聲明兩個屬性:

  1. @property (nonatomic, strong) NSString *string1;   
  2. @property (nonatomic, weak) NSString *string2; 

并定義

  1. @synthesize string1;   
  2. @synthesize string2; 

再來猜一下,下面輸出是什么?

  1.     self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];   
  2. elf.string2 = self.string1;   
  3. self.string1 = nil;  
  4. NSLog(@"String 2 = %@", self.string2); 

結果是:String 2 = null

分析一下,由于 self.string1與self.string2指向同一地址,且string2沒有retain內存地址,而self.string1=nil釋放 了內存,所以string1為nil。聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針。在 c/c++開發過程中,為何大牛都說指針的空間釋放了后,都要將指針賦為NULL. 在這兒用weak關鍵字幫我們做了這一步。

接著我們來看unsafe_unretained

從名字可以看出,unretained且unsafe,由于是unretained所以與weak有點類似,但是它是unsafe的,什么是unsafe的呢,下面看實例。

如果這樣聲明兩個屬性:

并定義

  1. @property (nonatomic, strong) NSString *string1;   
  2. @property (nonatomic, unsafe_unretained) NSString *string2; 

再來猜一下,下面的代碼會有什么結果?

  1. self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];   
  2. self.string2 = self.string1;   
  3. self.string1 = nil;  
  4. NSLog(@"String 2 = %@", self.string2); 

請注意,在此我并沒有叫你猜會有什么輸出,因為根本不會有輸出,你的程序會crash掉。 原因是什么,其實 就是野指針造成的,所以野指針是可怕的。為何會造成野指針呢?同于用unsafe_unretained聲明的指針,由于 self.string1=nil已將內存釋放掉了,但是string2并不知道已被釋放了,所以是野指針。然后訪問野指針的內存就造成crash.  所以盡量少用unsafe_unretained關鍵字。

責任編輯:閆佳明 來源: oschina
相關推薦

2012-04-04 22:36:52

iOS5

2012-01-18 14:14:29

iOS教程iOS5

2011-09-19 15:42:33

TwitteriOS5

2012-01-18 13:51:39

2011-08-09 14:25:43

蘋果iCloudiOS5

2011-08-16 14:59:31

IOS開發ViewDidUnloiOS 5

2015-07-31 10:24:27

swift引用關系

2012-05-27 20:21:40

2012-01-18 10:57:37

ARCiOS

2011-10-05 01:51:20

iOS5蘋果

2012-12-24 14:53:44

ios

2011-06-07 06:59:51

iOS 5iOS蘋果

2011-05-31 22:53:14

喬布斯WWDCiCloud

2011-06-07 07:06:33

iOS 5iOSWWDC

2011-06-09 10:51:53

iPhone 3GSiOS5蘋果

2013-07-22 14:47:56

iOS開發iOS5中ASIHtt

2013-04-15 10:48:16

Xcode ARC詳解iOS ARC使用

2010-06-03 11:12:55

Hadoop

2011-08-10 10:00:17

iOS 5升級

2013-04-16 15:49:31

iOS開發是否用ARC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色一级在线播放 | 久久久久久999 | 成人在线免费观看 | 看亚洲a级一级毛片 | 国产精品国产精品 | 日韩一区欧美一区 | 成人自拍视频 | 亚洲国产一区二区三区四区 | 一级看片免费视频囗交动图 | 羞羞网站免费观看 | 欧美性生活网 | 欧美国产视频 | 国产精品久久久久久久久久了 | 欧美一级小视频 | 国产精品久久久久久久久久久新郎 | 91av大全 | 国产精品日日夜夜 | 亚洲精品一区二区三区 | 综合精品 | 365夜爽爽欧美性午夜免费视频 | 日韩欧美在线免费观看视频 | 97久久精品午夜一区二区 | 国产精选一区 | 国产一区二区在线免费观看 | 久久久tv | 九九久久精品 | 婷婷五月色综合香五月 | 9久久婷婷国产综合精品性色 | 国产日韩欧美精品一区二区 | 日本久久精品视频 | 久草在线在线精品观看 | 欧美国产精品一区二区三区 | 亚洲精品1区2区3区 91免费看片 | 久久与欧美| 午夜久久久久久久久久一区二区 | 国产精品亚洲成在人线 | 在线观看国产wwwa级羞羞视频 | 精品九九| 国产乱码精品一品二品 | 日韩免费网站 | 亚洲国产精品一区 |