1. strong,retain,copy安全
strong weak是ARC引入的,strong至關於retain,可是對於有的類型,例如NSString,則使用strong至關於使用copy
這樣直接用strong就能夠直接處理retain和strong的狀況了。
weak至關於assign,可是比後者多一點:對象被幹掉時會將weak引用設爲nil,而對nil發送消息都不會致使崩潰
不然weak引用爲野指針,會出現問題多線程
上面說strong 有copy的功能是錯誤的哦。實驗例子併發
- (void)test { NSMutableString *newStr = [NSMutableString stringWithFormat:@"abcd"]; self.retainStr = newStr; self.strongStr = newStr; self.copStr = newStr; NSLog(@"newStr sting:%@", newStr); NSLog(@"retain sting:%@", self.retainStr); NSLog(@"strong string:%@", self.strongStr); NSLog(@"copy string:%@", self.copStr); NSLog(@"------------"); [newStr appendString:@"123"]; // [newStr appendString:@"-456"]; NSLog(@"newStr sting:%@", newStr); NSLog(@"retain sting:%@", self.retainStr); NSLog(@"strong string:%@", self.strongStr); NSLog(@"copy string:%@", self.copStr); NSLog(@"------------"); newStr = nil; NSLog(@"newStr sting:%@", newStr); NSLog(@"retain sting:%@", self.retainStr); NSLog(@"strong string:%@", self.strongStr); NSLog(@"copy string:%@", self.copStr); NSLog(@"------------"); [newStr appendString:@"+++"]; NSLog(@"newStr sting:%@", newStr); NSLog(@"retain sting:%@", self.retainStr); NSLog(@"strong string:%@", self.strongStr); NSLog(@"copy string:%@", self.copStr); }
結果app
2017-03-15 11:21:37.418 AppDemo[58848:4000958] newStr sting:abcd
2017-03-15 11:21:37.419 AppDemo[58848:4000958] retain sting:abcd
2017-03-15 11:21:37.419 AppDemo[58848:4000958] strong string:abcd
2017-03-15 11:21:37.419 AppDemo[58848:4000958] copy string:abcd
2017-03-15 11:21:37.419 AppDemo[58848:4000958] ------------
2017-03-15 11:21:37.420 AppDemo[58848:4000958] newStr sting:abcd123
2017-03-15 11:21:37.420 AppDemo[58848:4000958] retain sting:abcd123
2017-03-15 11:21:37.420 AppDemo[58848:4000958] strong string:abcd123
2017-03-15 11:21:37.420 AppDemo[58848:4000958] copy string:abcd
2017-03-15 11:21:37.420 AppDemo[58848:4000958] ------------
2017-03-15 11:21:37.421 AppDemo[58848:4000958] newStr sting:(null)
2017-03-15 11:21:37.421 AppDemo[58848:4000958] retain sting:abcd123
2017-03-15 11:21:37.421 AppDemo[58848:4000958] strong string:abcd123
2017-03-15 11:21:37.421 AppDemo[58848:4000958] copy string:abcd
2017-03-15 11:21:37.421 AppDemo[58848:4000958] ------------
2017-03-15 11:21:37.422 AppDemo[58848:4000958] newStr sting:(null)
2017-03-15 11:21:37.422 AppDemo[58848:4000958] retain sting:abcd123
2017-03-15 11:21:37.422 AppDemo[58848:4000958] strong string:abcd123
2017-03-15 11:21:37.422 AppDemo[58848:4000958] copy string:abcd函數
2. strong,weak性能
strong與weak是由ARC新引入的對象變量屬性atom
強引用與弱引用的廣義區別:
強引用也就是咱們一般所講的引用,其存亡直接決定了所指對象的存亡。若是不存在指向一個對象的引用,而且此對象再也不顯示列表中,則此對象會被從內存中釋放。
弱引用除了不決定對象的存亡外,其餘與強引用相同。即便一個對象被持有無數個弱引用,只要沒有強引用指向他,那麼其仍是會被清除。沒辦法,仍是 「強哥」 有面子。線程
簡單講strong等同retain
weak比assign多了一個功能,當對象消失後自動把指針變成nil,好處不言而喻。代理
在使用時,通常用 asssign 處理 int, double, NSInteger等原子類型, weak 指向 代理,弱引用對象等.指針
3. __weak, __strong
__weak, __strong 用來修飾變量,此外還有 __unsafe_unretained, __autoreleasing 都是用來修飾變量的。
__strong 是缺省的關鍵詞(定義變量時的默認屬性)。
__weak 聲明瞭一個能夠自動 nil 化的弱引用。
__unsafe_unretained 聲明一個弱應用,可是不會自動nil化,也就是說,若是所指向的內存區域被釋放了,這個指針就是一個野指針了。
(既然這麼危險,爲何還要用??? 這裏給了很好的回答: https://www.zhihu.com/question/55831650?sort=created )
__autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。
assign: setter方法直接賦值,不進行任何retain操做
retain: setter方法對參數進行release舊值再retain新值,全部實現都是這個順序
copy: setter方法進行Copy操做,與retain處理流程同樣,先舊值release,再Copy出新的對象,retainCount爲1。這是爲了減小對上下文的依賴而引入的機制。
nonatomic : 非原子性訪問,不加同步,多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級.因此 不加nonatomic對與多線程是安全的 。