在定義一個類的property時候,為property選擇strong還是copy特別注意和研究明白的,如果property是NSString或者NSArray及其子類的時候,最好選擇使用copy屬性修飾。為什么呢?這是為了防止賦值給它的是可變的數(shù)據(jù),如果可變的數(shù)據(jù)發(fā)生了變化限嫌,那么該property也會發(fā)生變化
示例代碼:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSArray *bookArray1;
@property (nonatomic, copy) NSArray *bookArray2;
@end
@implementation ViewController
- (void)viewDidLoad{
NSMutableArray *books = [@[@"book1"] mutableCopy];
ViewController *person = [[ViewController alloc] init];
person.bookArray1 = books;
person.bookArray2 = books;
[books addObject:@"book2"];
NSLog(@"bookArray1:%@",person.bookArray1);
NSLog(@"bookArray2:%@",person.bookArray2);
}
@end
我們看到靴庆,使用strong修飾的person.bookArray1輸出是[book1,book2],而使用copy修飾的person.bookArray2輸出是[book1]萤皂。這下可以看出來區(qū)別了吧撒穷。
備注:使用strong,則person.bookArray1與可變數(shù)組books指向同一塊內(nèi)存區(qū)域裆熙,books內(nèi)容改變端礼,導致person.bookArray1的內(nèi)容改變,因為兩者是同一個東西入录;而使用copy蛤奥,person.bookArray2在賦值之前,將books內(nèi)容復制僚稿,創(chuàng)建一個新的內(nèi)存區(qū)域凡桥,所以兩者不是一回事,books的改變不會導致person.bookArray2的改變蚀同。
說到底缅刽,其實就是不同的修飾符,對應(yīng)不同的setter方法蠢络,
- strong對應(yīng)的setter方法衰猛,是將_property先release(_property release),然后將參數(shù)retain(property retain)刹孔,最后是_property = property啡省。
- copy對應(yīng)的setter方法,是將_property先release(_property release)髓霞,然后拷貝參數(shù)內(nèi)容(property copy)卦睹,創(chuàng)建一塊新的內(nèi)存地址,最后_property = property