OC-024.OC中多对象的手动内存管理
来源:互联网 发布:2016淘宝睡衣模特红人 编辑:程序博客网 时间:2024/05/19 19:32
OC中现在开发的基本用到的是ARC的机制,但是网上有些框架可能是早期来发的,用的是MRC的机制,所以还是有必要了解一下MRC下多对象的内存是如何管理的。
OC中手动内存管理黄金法则:谁调用new,alloc,retain,copy,multableCopy,谁就要调用对应的release或autorelease
口诀:有加必有减(你需要一个对象的时候就retain一下,不需要的时候就release一下)
#import <Foundation/Foundation.h>//------mian#import "LSPerson.h"int main(int argc, const char * argv[]) { LSPerson *per = [[LSPerson alloc] init];//p=1 LSIpad *ipad1 = [[LSIpad alloc] init];//i=1 [per setIpad:ipad1];//p=1 i=2 [ipad1 release];//p=1 i=1 //如果新创建一个ipad2,那么 LSIpad *ipad2 = [[LSIpad alloc] init];//p=1 i=2 per.ipad = ipad2;//把新ipad赋值给per,在set方法中不release ipad1,那么ipad1永远不回收了 [ipad2 release];// per.ipad = ipad1; 如果没有上面的ipad2,又再次把ipad1赋值给它,那么在set方法中先被release了,那么已经清空的ipad是不能在调用retain的。需要加if判断地址是否一致。如果地址是一致的就什么都不做。 [per release]; return 0;}
#import <Foundation/Foundation.h>//------LSPerson.h#import "LSIpad.h"@interface LSPerson : NSObject{ LSIpad *_ipad;}-(void) setIpad:(LSIpad *)ipad;@end
#import "LSPerson.h"//------LSperson.m 最重要的是setter方法内部的内存管理@implementation LSPerson-(void) setIpad:(LSIpad *)ipad{ //成员对象创建的时候就被初始化为nil,对nil进行release是没任何效果的 //此处要加一个判断 //如果他们两不相同,才需要内存管理的代码// [ipad retain];// _ipad = ipad; 上面2句可以合并成下面 _ipad = [ipad retain]; //retain方法返回的是一个同类型的指针 if(_ipad != ipad){ [_ipad release]; _ipad = [ipad retain]; }}-(void)dealloc{// [_ipad release];//如果不加release那么人回收了,ipad还在,造成内存泄露// _ipad = nil; self.ipad = nil; //等价与上面2句,self。ipad会进入set方法,先release,再nil NSLog(@"%s",__func__); [super dealloc];}@end
#import <Foundation/Foundation.h>//------LSIpad.h@interface LSIpad : NSObject@end
#import "LSIpad.h"//------LSIpad.m@implementation LSIpad-(void)dealloc{ NSLog(@"%s",__func__); [super dealloc];}@end
0 0
- OC-024.OC中多对象的手动内存管理
- OC中手动管理内存
- OC的手动内存管理
- OC-手动内存管理
- OC手动内存管理的规则总结
- OC对象的内存管理
- OC-025.OC手动MRC内存管理@property的使用方法
- OC手动内存管理注意事项
- OC对象内存管理
- 九、oc中多对象内存管理基础学习
- OC学习笔记之OC对象的内存管理
- OC学习笔记之OC对象的内存管理二
- OC中内存管理
- OC手动内存管理-方法的保留和释放
- OC笔记 - 手动内存管理的基本概念(2015.1.30)
- OC的手动内存管理基础(IOS开发)
- OC 多个对象之间的内存管理
- OC的内存管理
- HTML5创建一个径向/圆渐变
- 线搜索(line search)方法
- leetcode:258 Add Digits-每日编程第二题
- matlab 将数组写入txt
- linux基础(十二)----linux编程基础----与用户交互
- OC-024.OC中多对象的手动内存管理
- Linux学习笔记(二) - sort,uniq,cut,wc 命令详解
- (java)Pascal's Triangle II
- 【剑指offer】之连续子数组的最大和
- 安装完CentOS 7 后必做的七件事
- leetcode:104 Maximum Depth of Binary Tree-每日编程第三题
- BOM与DOM简介
- 解决方案:Jboss修改jsp需要重启才生效
- Ubuntu 安装 wireshark