iOS開發(fā)-assign、retain、copy、strong、weak的區(qū)別

對于初學(xué)的開發(fā)者,對于assign、retain、copy、strong、weak的用法及意義可能不是很明白,我對于這個問題也研究了很久,寫篇博文,巧巧代碼,讓我們來瞧瞧吧!
先定義一個Student類:

#import <Foundation/Foundation.h>  
@interface Student : NSObject  
@property (nonatomic, copy) NSString *name;  
@end  

然后先是mrc下的assign聲明

@property (nonatomic, assign) Student *stu1; 

接下來初始化一個Student對象,并且敲入以下代碼

- (void)viewDidLoad {  
    [super viewDidLoad];  
    // Do any additional setup after loading the view, typically from a nib.  
    Student *stu = [[Student alloc] init];  
    stu.name = @"張三";  
    self.stu1 = stu;  
    NSLog(@"%p %p", &stu, &_stu1);  
    NSLog(@"%p %p", stu,_stu1);  
    self.stu1.name = @"李四";  
    NSLog(@"stu.name = %@", stu.name);  
    NSLog(@"stu的引用計數(shù) = %ld", [stu retainCount]);  
} 

控制臺輸出


20150721004232795.png

(一)所以我總結(jié),assign只是使指向stu的棧內(nèi)存上的的指針,也就是stu換了一個名字,換成了stu1,就是stu和stu1的作用和意義是一樣的,誰做了任何改變對應(yīng)的指向棧內(nèi)存的內(nèi)容也會隨之改變,但是棧內(nèi)存的引用計數(shù)還是1沒有增加。

接下來我們看看retain,改變stu1屬性為以下

@property (nonatomic, retain) Student *stu1;  

然后重新運(yùn)行程序控制臺輸出為:


dddd.png

(二)再來總結(jié)一下,retain是使指向棧內(nèi)存的指針多了一個,也就是引用計數(shù)加1,并且指針stu和stu1對于棧內(nèi)存的作用是一樣的,也就是一扇門多了一把鑰匙

接下來再看看copy的作用,同樣改變stu屬性為copy,但是如果是我們定義的對象,那么我們自己要實現(xiàn)NSCopying,這樣就能調(diào)用copy,貼出代碼

Student.h

#import <Foundation/Foundation.h>  
@interface Student : NSObject<NSCopying>  
@property (nonatomic, copy) NSString *name;  
@end  

Student.m

#import "Student.h"  
  
@implementation Student  
- (id)copyWithZone:(NSZone *)zone  
{  
       Student *stuCopy = [[</span><span class="s3">self</span><span class="s1"> </span><span class="s4">class</span><span class="s1">] </span><span class="s4">allocWithZone</span><span class="s1">:zone];</span></p><p class="p1"><span class="s1">    stuCopy.</span><span class="s5">name</span><span class="s1"> = [</span><span class="s3">self</span><span class="s1">.</span><span class="s5">name</span><span class="s1"> </span><span class="s4">copyWithZone</span><span class="s1">:zone];</span></p><p class="p1"><span class="s1">    </span><span class="s3">return</span><span class="s1"> stuCopy;</span></p>}  
@end  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容