作者: 傲骨天成科技 | 来源:发表于2017-06-29 16:34 被阅读20次

    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方法

    相关文章

      网友评论

          本文标题:

          本文链接:https://www.haomeiwen.com/subject/zvmucxtx.html