1.NSString類型的屬性為什麼用copy NSString類型的屬性可以用strong修飾,但會造成一些問題,請看下麵代碼 2016-03-15 10:10:25.772 string[619:12684] 可變字元串修改前nameStrong= zhangsan nameCopy=z
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=zhangsan
2016-03-15 10:10:25.773 string[619:12684] 可變字元串修改後nameStrong= zhangsanfeng nameCopy=zhangsan
可變字元串改變時,strong修飾的字元串也跟著改變了,而copy修飾的字元串沒有改變
總結:用strong修飾的字元串,當NSMutableString的字元串給他賦值時,NSMutableString的字元串變了,它也會跟著改變,因為stong只是指針的引用,引用計數加1。
用copy修飾的字元串,不會隨著源頭的改變而改變,因為copy會複製一份。
如果源頭的字元串是不可變的,那麼用copy和strong是一樣的,因為源頭是不可變的字元串嘛,所以用copy還是strong看你的需要了,想讓他隨著源頭改變就用strong,不想改變有用copy,一般不會讓它改變,所以安全起見,字元串會用copy
2.代理.手動拖線的控制項為什麼用weak
self->對象(比如person對象)->代理->self(設置代理時:self.delegate=self);
會造成迴圈引用, 使用weak表明該屬性定義了一種非擁有關係,為這種屬性設置新值時,既不保留新值也不會釋放舊值。
首先手動拖線的控制項用weak不是因為會造成迴圈引用,self->view->sunViews->控制項,這樣已經有個強引用了,如果控制項用strong,self->控制項,這個控制項有兩個強引用,釋放時要剪斷兩個對他的引用,如果有一個沒有釋放,這個控制項就不能釋放了,當然用strong也沒有錯,還更加安全呢。
3.block為什麼用copy
block的方法內容是在棧區的,首先棧區是系統自動管理的,隨時會清除記憶體,,再訪問時可能會造成野指針,copy關鍵字會把block的內容複製到堆區,堆區由程式員自己管理。