1.NSString類型的屬性爲何用copy程序員
NSString類型的屬性能夠用strong修飾,但會形成一些問題,請看下面代碼安全
#import "ViewController.h" @interface ViewController () @property(nonatomic,strong) NSString *nameStrong; @property(nonatomic,copy) NSString *nameCopy; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSMutableString *muStr = [NSMutableString stringWithString:@"zhangsan"]; self.nameCopy = muStr ; self.nameStrong = muStr; NSLog(@"可變字符串修改前nameStrong= %@ nameCopy=%@",self.nameStrong,self.nameCopy); [muStr appendString:@"feng"]; NSLog(@"可變字符串修改後nameStrong= %@ nameCopy=%@",self.nameStrong,self.nameCopy); }
打印結果以下:
2016-03-15 10:10:25.772 string[619:12684] 可變字符串修改前nameStrong= zhangsan nameCopy=zhangsanapp
2016-03-15 10:10:25.773 string[619:12684] 可變字符串修改後nameStrong= zhangsanfeng nameCopy=zhangsanatom
可變字符串改變時,strong修飾的字符串也跟着改變了,而copy修飾的字符串沒有改變
總結:用strong修飾的字符串,當NSMutableString的字符串給他賦值時,NSMutableString的字符串變了,它也會跟着改變,由於stong只是指針的引用,引用計數加1。spa
用copy修飾的字符串,不會隨着源頭的改變而改變,由於copy會複製一份。代理
若是源頭的字符串是不可變的,那麼用copy和strong是同樣的,由於源頭是不可變的字符串嘛,因此用copy仍是strong看你的須要了,想讓他隨着源頭改變就用strong,不想改變有用copy,通常不會讓它改變,因此安全起見,字符串會用copy指針
2.代理.手動拖線的控件爲何用weakcode
self->對象(好比person對象)->代理->self(設置代理時:self.delegate=self);對象
會形成循環引用, 使用weak代表該屬性定義了一種非擁有關係,爲這種屬性設置新值時,既不保留新值也不會釋放舊值。blog
首先手動拖線的控件用weak不是由於會形成循環引用,self->view->sunViews->控件,這樣已經有個強引用了,若是控件用strong,self->控件,這個控件有兩個強引用,釋放時要剪斷兩個對他的引用,若是有一個沒有釋放,這個控件就不能釋放了,固然用strong也沒有錯,還更加安全呢。
3.block爲何用copy
block的方法內容是在棧區的,首先棧區是系統自動管理的,隨時會清除內存,,再訪問時可能會形成野指針,copy關鍵字會把block的內容複製到堆區,堆區由程序員本身管理。