内存管理 引用计数 深浅拷贝
常量区:可变和不可变
内存管理原则
/**1.谁创建。谁释放 alloc relese/autorelese
2.谁持有,谁释放 retain relese/autorelese
* 3.没有retain和alloc和COPY就不需要release,有就一定要释放
<1>引用计数:就是看见alloc . copy retain 的时候就说明该对象的引用计数加一了,就得给出相对应的release来释放它,手动释放完对象后,系统会自动调用dealloc方法,来释放自己的属性,但是基本数据类型不需要释放,因为引用计数只对对象起作用,在dealloc方法中先释放自己的属性,最后在释放父类的属性,dealloc方法是在当对象的引用计数为1时系统再次调用release方法时。系统就会自动走这个dealloc方法
⁃ (void)dealloc{
⁃ [_name realese];
⁃ [super dealloc];
⁃ }
<2>输出引用计数的方法:[对象名.方法名 stu1.retainCount ];
<3>释放顺序和初始话是相反的:先释放自己,在释放父类的
在Mac中,当所有的对象都被释放的时候我们会调用deall方法
方法实现时的两种选择
<1>@required 这个是必须实现的,也是默认的
<2>optional 这个是可选的,当我们没有选择的时候一般用的是默认的,也就是必须实现的方法
判断类里面的这个方法有没有实现:
深拷贝与浅拷贝
<1>浅拷贝是将p的内容赋给另一个指针q。(p里面存储的是地址)这样两个指针指向同一个内存地址。
深拷贝是另外开辟一块存储空间。将p指向的地址中的内容复制到新开辟的存储空间。而q则指向新开辟的存储空间。
<2>深拷贝与浅拷贝
浅拷贝:就是指将A的名字复制给B,但是更改B的名字的时候,A的名字不会改变
深拷贝:对象,对象内部的引用均复制。然后更改B对象属性的时候,A对象的属性也会跟着改变
不可变字符串的引用计数为什么是整数的最大值:它的引用计数永远都是-1