前言:
iOS中数据是存在堆和栈中的,然而我们的内存管理管理的堆上的内存,栈上的内存并不是我们管理
非OC对象(基础数据类型)存储在栈上,栈是由系统自动分配并释放
OC对象存储在堆上
一、各个修饰符解析
strong:表示指向并拥有该对象,其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。
weak:表示指向但不拥有该对象。其修饰的对象本身引用计数不会增加。无需手动设置,该对象会自行内存中销毁。
assign:主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值存在于栈上。有系统自动管理内存
copy:
1、源对象是不可变对象,不论是copy还是strong,都是浅拷贝,不开辟新的内存,。此时使用copy和strong,并没有对数据产生影响。
2、源为可变对象时,使用copy声明属性,会深拷贝,开辟一块新的内存空间存放值,源数据不论发生怎么变化,都不会影响copy属性中的值,属于深拷贝。
也就是说:copy出来的字符串一定是不可变字符串,如果传入的是可变字符串,会发生深拷贝为不可变字符串,否则为浅拷贝。
二、使用
1、可变用strong的原因
NSMutableString *str = [NSMutableString stringWithString:@"3"];
self.MutableStrCopy = str;/
上面的代码中self.MutableStrCopy时用copy修饰的全局变量,使用可变str个MutableStrCopy赋值之后可以看到我们的MutableStrCopy类型变成了NSString不可变字符串。此时如果再调用可变字符串的方法例如appendString
就会报unrecognized selector
而crash。
2、不可变用copy的原因
self.string
是一个strong修饰的不可变字符串,将可变字符串str赋值给string后,再去改变可变字符串str的值,self.string的值也一样会被修改。数据将会不安全
NSMutableString *str = [NSMutableString stringWithString:@"3"];
self.string = str;
[str appendString:@"san"];
网友评论