设为首页 加入收藏

TOP

OC基础:内存(内存管理)
2015-07-16 12:04:26 来源: 作者: 【 】 浏览:185
Tags:基础 内存 管理

自动释放池:

@autoreleasepool {

}

?

内存管理机制 谁污染,谁治理

垃圾回收机制:gc(Garbage collection),由 系统管理内存,开发人员不需要管理.

OC从版本2.0之后开始支持垃圾回收机制,但iOS开发平台不支持垃圾回收机制

?

继承自NSObject的对象需要内存管理

OC中通过引用计数器管理内存

?

通过引用计数器管理内存的两种方式

1.MRC:(maual reference count),手动引用计数,就是开发人员通过引用计数管理内存

2.ARC:(Automatic reference count),自动引用计数,由系统自动通过引用计数管理内存

ARC是基于MRC创建出来的

使用alloc生成对象的时候会将引用计数由0变为1

?

?

打印引用计数

retainCount:引用计数

打印retainCount 需要在ARC之下.

retainCount占4个字节

当retainCount变为0的时候,会自动调用dealloc方法.

?

-(void)dealloc{

NSLog(@"%@对象已经被销毁",_name);

[superdealloc];//必须调用super的dealloc,且写在最下面

}


?

僵尸对象:所占内存已经对回收的对象.僵尸对象不能再使用.

野指针:指向僵尸对象的指针.

?

空指针;没有指向任何东西的指针(nil,NULL,0).如:per1=nil;

操作空指针不会报错

?

alloc对应dealloc retain对应relase

?

?

autorelease和release的区别

1.autorelease相比release,也是对引用计数器执行减一操作,但不是立即减一,而是在未来的某个时刻减一(出了自动释放池)

2.autorelease的实质;对一个对象使用autorelease操作,这个对象的引用计数不会立即减一,对象会被放到自动释放池里,待出了释放池才减一

?

for (int i=0; i<1000000; i++) {

Person *person=[[Personalloc]init];//1

//数组会对添加的对象做一次引用计数+1

// 数组在释放自己之前,会对之前添加的所有元素release操作(引用计数-1)

[array addObject:person];//2

[person release];//1

}

?

copy的使用:

对象使用copy的前提:这个类遵循了NSString ,且必须实现协议内的方法.

把某一内存区域的内容拷贝一份,拷贝到新的内存空间?去,被拷?区域的引?计数不变,新的内存区域的引用计数为1。

?

?


?

?

-(id)copyWithZone:(NSZone *)zone{

//浅拷贝:拷贝的是指针(地址)

// return [self retain];

?

//深拷贝:拷贝的是内容.

// 返回一个新的对象,跟原来的对象所占空间大小相同,空间内的内容也是相同的

Person *p=[[PersonallocWithZone:zone]init];

p.name=self.name;

return p;

}


?

?

?

new:申请内存并将retainCount从0变1

?

-------------------

?

//内存管理了原则

// +1:alloc,copy,new,retain

// -1:release,autorelease

// 一旦对象的引用计数器为0,系统会自动调用dealloc方法,之后就不能再对对象进行操作

// 谁污染谁治理


?

?

//自动释放池的两种形式

//1.

@autoreleasepool {

?

}

//2.自动释放池的另一种形式(想当于自己建立的释放池)

NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];

?

[pool release];


?

?

?

?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据结构之---C语言实现线索二叉树 下一篇Objective-C语法学习 第四天

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: