@property
来声明属性变量时,编译器会自动为咱们生成一个如下划线加属性名命名的实例变量(@synthesize copyyStr = _copyyStr)
,而且生成其对应的getter、setter
方法。当咱们用self.copyyStr = originStr
赋值时,会调用coppyStr的setter
方法,而_copyyStr = originStr
赋值时给_copyyStr实例变量直接赋值,并不会调用copyyStr的setter
方法,而在setter
方法中有一个很是关键的语句 _copyyStr = [copyyStr copy];
结论:用self.copyyStr = originStr 赋值时,调用copyyStr的setter方法,setter方法对传入的copyyStr作了次深拷贝生成了一个新的对象赋值给_copyyStr,因此_copyyStr指向的地址和对象值都再也不和originStr相同git
这就要扯到堆和栈的问题了,基本数据类型会被分配到栈空间,而栈空间是由系统自动管理分配和释放的,就不会形成野指针的问题github
容器类概念:NSArray、NSDictionary、NSSet为容器类型的对象指针
非容器类总结code
对象类型 | 不可变对象 | 可变对象 |
---|---|---|
copy | 浅拷贝 | 深拷贝 |
mutableCopy | 深拷贝 | 深拷贝 |
对象类型 | 不可变对象 | 可变对象 |
---|---|---|
copy | 浅拷贝 | 深拷贝 |
mutableCopy | 深拷贝 | 深拷贝 |
附:个人博客地址对象