首页 > 代码库 > 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操作之外的:copyretain的次数。)

 所以每个对象分配的内存都会给记录和管理对象的数据 而分配额外空间。

 

 //插话:项目两个人做,通过api文档怎么用,一人分配内存,另一人释放内存,C/C++普遍存在,所以OC就添加了计数器来记录使用次数

   指针4个字节

 对象分配空间分为两部分:管理空间,存储空间,管理空间的地址一般比存储空间的地址低。

 几个指针指向同一个对象(内存),他们在释放内存之前需要协商,不可私自释放。

 基本对象NS,非基本对象:int char

 ,每个对象都有一个retainCountallocretain

 retain的目的是把对象的引用计数+1

 deallocrelease,前者释放,后者把对象引用计数-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