2 回答
TA贡献1844条经验 获得超8个赞
如两个对象NSString *str1=[[NSString alloc] initWithString:@"string1"];
NSString *str2=[[NSString alloc] initWithString:@"string2"];
str2=str1; //使指针str2的指向与str1指向相同内存。结果就是造成了上面的alloc下动态分配
的内存,内存泄露.当调用[str1 release]; [str2 release];内存的释放最终调用的是[str1 dealloc];
或者是[str2 dealloc],什么情况下才会调用这个释放内存的dealloc方法呢?当创建的对象其引用计数(retainCount)为0时,就会调用。
而哪些方法会造成引用计数改变呢?
1.调用alloc方法
2.调用copy,retain 特性
3.relase方法
str2=[str1 copy]; 引用计数加1,所以当调用[str1 release];时str2与str1指向的共同对象并未析构,就是还存在。如果用直接复制str2=str1就不存在了。
引用计数变化为: 1.调用alloc使引用计数加1,变为了1.
2.调用copy,引用计数加1,变为2.
3.调用release,引用计数减1,变为1; 所以引用计数不为0,不会调用dealloc释放内存
的函数,所以内存还存在,如果要释放内存,必须再release一次。
所以这才是两者之间根本区别。
用C语言解释就是,新分配一块内存空间来存储要复制的值。
- 2 回答
- 0 关注
- 659 浏览
添加回答
举报