1、
内存管理方式
//OC通过引入计数器管理内存
图中那个的行为
|
|
OC中方法
|
根据照明设备所做的动作
|
对对象的操作
|
|
开灯 |
生成对象
|
alloc/copy/new
|
需要照明
|
持有对象
|
return
|
不需要照明
|
释放对象
|
release/autorelese(不会立即释放且与@autoreleasepool配合使用)
|
关灯
|
废弃对象 |
dealloc
|
2、iOS平台下适用计数器如何管理内存,有两种方式
ARC和MRC的混编
==============================================================
例子:
1.自己创建的对象自己持有;
Person.h
@interface Person : NSObject
//名字的属性
@property (nonatomic,copy)NSString *name;
@end
Person.m
@implementation Person
//dealloc 方法是对象被销毁的时候自动调用的方法,不需要手动调用,由于dealloc方法是重写的父类,所以重写此方法的时候,一定要把父类的方法内容也写上
//dealloc 方法是对象被销毁的时候自动调用的方法,不需要手动调用,由于dealloc方法是重写的父类,所以重写此方法的时候,一定要把父类的方法内容也写上
- (void)dealloc
}
@end
main.m
Person *p = [[Person alloc]init];//alloc会造成对象的引用计数器由0-->1
//
// [p release]; 不要过度释放,也等于操作僵尸对象
3、retain可以让对象的引用计数 +1
//非自己创建的对象,自己也能持有
p2 = [p2 retain]; //由1--->2
NSLog(@"%lu",p2.retainCount);
//非自己创建的对象,自己也能持有
Person *p3 = [p2 retain];
NSLog(@"%lu",p3.retainCount); //2--->3
[p2 release];//3-->2
[p2 release];//2-->1
[p3 release];//1-->0
Person *p4 = [[Person alloc]init];
p4. name = @"小骨";
[p4 retain];//2
[p4 retain];//3
[p4 retain];//4
[p4 release];//3
[p4 release];//2
[p4 release];//1
// [p4 retain];//人死不能复生,对象死也不能复生
4、 方法的基本使用
5、 概念
6、 autorelease 执行实质,对一个对象使用autorelease 操作,这个对象的引用计数器不会立即减1,如果把这个autorelease 操作放到自动释放出中,会在出池子的一瞬间减1,如果你没有放到池子中,不会对autorelease 操作对象进行减1;
// Person *p5 = [[Person alloc]init];//0--->1
// p5.name = @"杀阡陌";
// [p5 autorelease];//1
// NSLog(@"%lu",p5.retainCount);
=======================================================
7、创建自动释放池的两种形式
//第一种形式
// NSAutoreleasePool 自动释放池类
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
Person *p6 = [[Person alloc]init];
p6. name = @"白子画";
[p6 autorelease];//或者用[p6 release];
NSLog(@"%lu",p6.retainCount);
[pool release];
//第二种形式
@autoreleasepool {
Person *p7 = [[Person alloc]init];
p7. name = @"糖宝";
[p7 autorelease];//未来的时间减1,出自动释放池减1
// [p7 release];//-1 //过度释放
NSLog(@"%lu",p7.retainCount);
//
8、 内存管理的原则
//水污染谁治理,谁alloc谁release,谁return谁release,autorelease
//你想占用某个对象,就应该让对象的计数+1,(也就是让对象做以retain操作)
重复使用的释放可以设置带有参数的宏定义,减少繁琐的程序
#define kRelease_Safe(_point) [_point release];_point = nil;
// [p8 release];//对一个空指针发送消息,没有任何影响
9、 NSMutableArray *mArray = [[NSMutableArray alloc]initWithCapacity:0];
//向数组中添加十个人
for (int i = 0; i < 10 ; i ++) {
Person *person = [[Person alloc]init];
person. name = [NSString stringWithFormat:@"%d",i];
//数组在添加元素的时候,会对添加的元素做一次retain操作
[mArray addObject:person];
kRelease_Safe(person);
======================================================
10、 copy 对象能够使用copy操作的前提是,此类必须遵循NSCopying 协议
区别:浅拷贝会造成原对象的引用计数加+1,而深拷贝不会造成原对象的计数加+1;
例子:在Person类基础上举例
Person.h
#import
@interface Person : NSObject<</span>NSCopying>必须遵循NSCopying 协议
//名字的属性
@property (nonatomic,copy)NSString *name;
@end
Person.m
- (void)dealloc{
NSLog(@"Person%@对象被销毁了",_name);
}
- (id)copyWithZone:(NSZone *)zone{
//返回对象的时候要做一次retain操作,外界的接受者才持有这个对象
//深拷贝 返回的是新的对象,此时两个对象所占的空间大小相同,内容也相同
Person *p = [[Person allocWithZone:zone]init];
}
@end
main.m
=====================================================
11、 new 申请创建对象的同时让其引用计数0-—>1 (不常用)
总结:内存管理的总结
欢迎学习本文,未经许可,不得私自转载!