首页 > 代码库 > OC内存管理-1
OC内存管理-1
/*************person.h****************/
#import <Foundation/Foundation.h>
@class Dog;
@interface Person :NSObject
{
Dog *_dog;
}
-(void)Tobug:(Dog *)newdog;
-(void)setDog:(Dog *)newdog;
@end
/*************person.m****************/
#import"Person.h"
#import"Dog.h"
@implementation Person
//declare:如果你想要一个dog对象,必须使用这个方法,
-(void)setDog:(Dog *)newdog{
if (newdog != _dog) {
//这一步判断是必要的,防止一个人用完一只狗没有解绳子而直接去用另一只狗
[_dogrelease];
_dog = [newdog retain];
}
}
//人让狗叫:
-(void)Tobug:(Dog *)newdog{
//狗调用自己的bug
[newdogbug];
}
//复写dealloc方法:
-(void)dealloc{
NSLog(@"dealloc!");
[_dogrelease];
[superdealloc];
}
//复写release方法:
-(onewayvoid)release{
NSLog(@"release!");
[super release];
}
@end
/*************Dog.m****************/
#import<Foundation/Foundation.h>
@interface Dog :NSObject
{
int _ID;
}
@propertyint ID;
-(void)print_counter;
-(void)bug;
@end
/*************Dog.m****************/
#import "Dog.h"
@implementation Dog
//打印目前dog的引用计数(reference counting)的值
-(void)print_counter{NSLog(@"retaincount:%li",[selfretainCount]);}
//狗叫:
-(void)bug{NSLog(@"T‘m a dog!");}
@end
/*************main.m****************/
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
/*
每个对象都有一个计数器,可以记录当前对象被使用过多少次。(“使用次数”不准确,应该是被除alloc操作之外的:copy,retain的次数。)
所以每个对象分配的内存都会给记录和管理对象的数据 而分配额外空间。
//插话:项目两个人做,通过api文档怎么用,一人分配内存,另一人释放内存,C/C++普遍存在,所以OC就添加了计数器来记录使用次数
指针4个字节
对象分配空间分为两部分:管理空间,存储空间,管理空间的地址一般比存储空间的地址低。
几个指针指向同一个对象(内存),他们在释放内存之前需要协商,不可私自释放。
基本对象NS,非基本对象:int char等
,每个对象都有一个retainCount,alloc,retain,
retain的目的是把对象的引用计数+1,
dealloc和release,前者释放,后者把对象引用计数-1,
实验证明,lli所指向的person对象的“引用计数”(reference count)的值为1时,【lli dealloc】是在“引用计数”的值将要减到0的时候被系统自动调用。dealloc之后,一切后灰飞烟灭了,所以如果你想在“引用计数”值为1时,【lli relea】之后,打印“引用计数”的值是不可能的,除非你能够阻止编译器调用dealloc摧毁对象。
*/
}
Person *lli = [[Personalloc] init];
Person *tti = [[Personalloc] init];
Person *nni = [[Personalloc] init];
Dog *dog_1 = [[Dogalloc] init];//retaincount = 1
[llisetDog:dog_1];
[dog_1print_counter];
[lli release];
[dog_1 print_counter];
Dog *dog_2 = [[Dog alloc] init];
[nni setDog:dog_1];
[dog_1 print_counter];
[nni setDog:dog_2];
[dog_1 print_counter];
return 0;
}
OC内存管理-1