@property中的copy.strong.weak總結

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的內容複製到堆區,堆區由程序員本身管理。

相關文章
相關標籤/搜索