码迷,mamicode.com
首页 > 其他好文 > 详细

OC内存管理-1

时间:2014-11-16 17:26:58      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   io   color   ar   使用   sp   strong   数据   div   

/*************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) {

        //这一步判断是必要的,防止一个人用完一只狗没有解绳子而直接去用另一只狗

        [_dog release];

        

        _dog =  [newdog retain];

    }

}

//人让狗叫:

-(void)Tobug:(Dog *)newdog{

    //狗调用自己的bug

    [newdog bug];

}

//复写dealloc方法:

-(void)dealloc{

    NSLog(@"dealloc!");

    [_dog release];

    [super dealloc];

}

//复写release方法:

-(oneway void)release{

    NSLog(@"release!");

    [super release];

}

@end




/*************Dog.m****************/

#import <Foundation/Foundation.h>


@interface Dog : NSObject

{

    int _ID;


}

@property int ID;

-(void)print_counter;

-(void)bug;

@end



/*************Dog.m****************/


#import "Dog.h"


@implementation Dog

//打印目前dog的引用计数(reference counting)的值

-(void)print_counter{NSLog(@"retaincount:%li",[self retainCount]);}

//狗叫:

-(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 = [[Person alloc] init];

    Person *tti = [[Person alloc] init];

    Person *nni = [[Person alloc] init];

    

    Dog *dog_1 = [[Dog alloc] init];//retaincount = 1

    [lli setDog:dog_1];

    [dog_1 print_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

标签:style   io   color   ar   使用   sp   strong   数据   div   

原文地址:http://blog.csdn.net/u012360598/article/details/41172217

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!