對于初學(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