1.用_属性赋值,是直接赋值地址,把指针指向内存,strong/copy/retain等修饰词并不起作用
2.用self.赋值,是使用setter方法,通过imp找到对应的内存,根据属性的修饰词进行操作赋值。(copy修饰的属性使用objc_setProperty方式实现,其它属性使用内存偏移实现)
用_或者self.进行属性赋值,对使用copy修饰的属性有影响之外,别的区别不大,因为strong/retain等只是引用计数的增加,而copy修饰的时候,如果是进行的深拷贝(比如copy对象为multable数据),_并不会重新开辟内存,而self.会开辟一份新内存(深拷贝)。
附:常量并没有getter/setter方法,如果在没有手动干涉的情况下,系统默认会为属性生成“_属性”和getter/setter方法,并将_属性保存在类的ivar_list_t(变量列表)列表中。所以用_,其实和使用常量没有区别,而用self.才是真正意义上的对属性进行访问/赋值