OC内存管理-1

/*************person.h****************/



/*注:实验前请关闭ARC*/

#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 =  [newdogretain];

    }

}

//人让狗叫:

-(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,constchar * 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];

    

    

    

    

   return0;

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值