1.先用代码示例
@interface ViewController ()
@property (strong, nonatomic) NSArray *bookArray1;
@property (copy, nonatomic) NSArray *bookArray2;
@end
@implementation ViewController
(void)viewDidLoad {
[super viewDidLoad];
[self questionDescribe];
}-
(void)questionDescribe {
NSMutableArray *books = [@[@"我是1"] mutableCopy];
self.bookArray1 = books;
self.bookArray2 = books;
[books addObject:@"你好"];NSLog(@"bookArray1(strong) = %@ \n bookArray2(copy) = %@",self.bookArray1, self.bookArray2);
}
打印出的结果是:bookArray1(strong) = (
"我是1",
"你好"
)
bookArray2(copy) = (
"我是1"
)
2.从上面我们大概能看出来strong和copy的区别了吧?
使用strong,则self.bookArray1与可变数组books指向同一块内存区域,books内容改变,导致self.bookArray1的内容改变,因为两者是同一个东西;而使用copy,self.bookArray2在赋值之前,将books内容复制,创建一个新的内存区域,所以两者不是一回事,books的改变不会导致self.bookArray2的改变。
3.说到底就是不同的修饰符,对应不同的setter方法
(1).strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain), 最后是_property = property
(2).copy对应的setter方法,是将_property先release (_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property
4.property的本质?
@property = 实例变量 + getter + setter
5.下划线和self的区别?
下划线只代表实例变量,不调用setter方法和getter方法
self会调用setter和getter方法