【iOS开发】strong和copy的区别

Question description:

我们经常在给一个类定义property时,会考虑到修饰符strong和copy,通常情况下NSArray和NSString,最好使用copy。But why?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化。

代码示例:

// 定义一个Student类
@interface Student : NSObject

@property (nonatomic, strong) NSArray *booksArray1;//strong 类型

@property (nonatomic, copy) NSArray *booksArray2;  //copy 类型

@end


// 定义一个ViewController类
@implementation ViewController
- (void)viewDidLoad 
{
    [super viewDidLoad];

    NSMutableArray *books = [NSMutableArray arrayWithObject:@"book1"];

    Student *stu = [[Student alloc] init];
    stu.booksArray1 = books;
    stu.booksArray2 = books;

    [books addObject:@"book2"];

    NSLog(@"\n booksArray1:%@  \n booksArray2:%@",stu.booksArray1,stu.booksArray2);
}
@end

打印结果:

2016-06-23 15:54:23.492 testt[2215:481336] 
 booksArray1:(
    book1,
    book2
)  
 booksArray2:(
    book1
)
依据打印结果,我们可以看到,用strong修饰的stu.booksArray1输出[book1,book2];用copy修饰的stu.booksArray2输出[book1]。
备注:使用strong,则person.bookArray1与可变数组books指向同一块内存区域,books内容改变,导致person.bookArray1的内容改变,因为两者是同一个东西;而使用copy,person.bookArray2在赋值之前,将books内容复制,创建一个新的内存区域,所以两者不是一回事,books的改变不会导致person.bookArray2的改变。

说到底,其实就是不同的修饰符,对应不同的setter方法:

<1> strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
<2> copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property。

你可能感兴趣的:(Objective-C)