ios学习笔记之OC篇(二):引用计数

原创 2013年12月02日 15:28:19
例题:已知存在属性@property (nonatomic,retain) NSArray *arr;该属性自动生成的set方法代码为:
-(void) setArr:(NSArray *)arr
{
     _arr=arr;
     [_arr retain];
}
示例1:
@property (nonatomic,retain) Person *friend;

Person *p=nil;
   
 @autoreleasepool {
       
        //没有添加进自动释放池时,自动释放池对其无影响

        p=[[[
Person alloc]init]autorelease];//+1假如没有autorelease最后一个retainCount仍保持2,不会-1
       
 Person *p1=p;//不变
       
 NSLog(@"%ld",[p retainCount]);
//        Person *p2=[p copy];//p的引用计数不+1
//        NSLog(@"%ld",[p retainCount]);
       
 Person *p3=[[Person alloc]init];
        p3.
friend=p;//p的引用计数+1
       
 NSLog(@"%ld",[p retainCount]);
       
       
 NSLog(@"Hello, World!");
       
    }
//p的引用计数-1
    NSLog(@"%ld",[p retainCount]);
示例2:常量没有引用计数机制,因为永远不能释放这些对象:NSNumber,NSString...也同样适用于使用常量字符串初始化的不可变字符串对象
@autoreleasepool {
//        NSNumber *myInt=[NSNumber numberWithInt:100];  //+1
//        NSNumber *myInt1;  //NSNumber显示不正确
       
 Person *myInt=[[Person alloc]init];
       
 Person *myInt1;
       
 NSMutableArray *myArr=[NSMutableArray array];
       
       
 NSLog(@"myInt retainCount is %ld",[myInt retainCount]);//1
        [myArr
 addObject:myInt];
       
 NSLog(@"after add to array ,myInt retainCount is %ld",(unsigned long)[myInt retainCount]);//2
        myInt1=myInt;
       
 NSLog(@"after assign to myInt1 ,myInt retainCount is %ld",(unsigned long)[myInt retainCount]);//2
        [myInt
 retain];
       
 NSLog(@"after retain ,myInt retainCount is %ld",(unsigned long)[myInt retainCount]);//3
       
 NSLog(@"after retain ,myInt1 retainCount is %ld",(unsigned long)[myInt1 retainCount]);//3
        [myInt
 release];
       
 NSLog(@"after release ,myInt retainCount is %ld",(unsigned long)[myInt retainCount]);//2
        [myArr
 removeObjectAtIndex:0];
       
 NSLog(@"after remove from array,myInt retainCount is %ld",(unsigned long)[myInt retainCount]);//1
    }
示例3:引用计数与实例变量
-(void)setName:(NSString *)_name
{
   
 name=_name;
}
-(
NSString *)name
{
   
 return name;
}

NSMutableString *str3=[NSMutableString stringWithString:@"string 3"];
       
 Person *person =[[Person alloc]init];
       
 NSLog(@"str3 retainCount is %ld",[str3 retainCount]);//1
        [person
 setName:str3];
        NSLog(@"after assign to name ,str3 retainCount is %ld",[str3 retainCount]);//1
ps:假如setName方法的实现为:name=_name;[name retain];则str3的retainCount会+1。

相关文章推荐

从今天开始学习ios,入门第一天(Object-C学习笔记)自动引用计数和为类添加属性

1.Clang静态分析工具 使用ARC机制已经成为了Mac和ios开发者的基本练习,使用ARC的最大好处就是初学者不用再为内存管理的诸多问题而担心了,不过这并不代表你不需要知道对象在内存中的存储机制。...

黑马程序员——Objective-C程序设计(第4版)学习笔记之17-内存管理和自动引用计数——黑马 IOS 技术博客

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 内存管理关心的是清理(回收)不用的内存,以便内存能够再次利用。 ...

《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第一章自动引用计数

第一章:自动引用计数 一、什么是自动引用计数 二、内存管理/引用计数 1、概要 2、内存管理的思考方式 3、alloc/retain/release/dealloc实现 4、苹果的实现 5、aut...

COM学习笔记(二):引用计数

IUnknown的另外两个成员函数AddRef和Release的作用就是给客户提供一种让它指 示何时处理完一个接口的手段。 引用计数的三条规则: 1.在返回之前调用AddRef。对于那些...

【《Objective-C 高级编程》 学习笔记--引用计数】

1  引用计数     苹果iOS的内存是通过引用计数的方式来管理的。引用计数的苹果官方实现(通过方法调试推测)是通过一个引用计数列表(散列表  )的方式进行管理的,引用计数表中每一像指向一个引用计数...
  • fiempty
  • fiempty
  • 2015年08月18日 20:03
  • 280

[cocos2d-x3.x学习笔记]引用计数 内存管理 Ref AutoreleasePoo PoolManager

Ref是根对象,老版本对应CCObject Ref内部可以通过引用计数来控制堆内存回收。retain()计数加一release()计数减一,当计数为0时,删除本对象。 AutoreleasePoo...

swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用。这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理。当实例并不再被需要时,ARC会自动释放这些实例所使用的内...
  • xdrt81y
  • xdrt81y
  • 2015年03月23日 14:46
  • 1764

ATL学习笔记(1):ATL单线程与多线程套间对象引用计数的基础实现

COM对象必须在套间中运行。套间分为单线程套间和多线程套间。在单线程套间中,套间保证COM对象实例仅有一个线程可以访问,而在多线程套间中,COM对象实例可同时被多个线程访问。因此,在多线程套间中执行的...

The Swift Programming Language学习笔记(十七)——自动引用计数

自动引用计数 自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 弱引用 无主引用 无主引用以及隐式解析可选属性 闭包引起的循环强引用 解决闭包引起的循环强引用...

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

swift ARC,内存管理。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios学习笔记之OC篇(二):引用计数
举报原因:
原因补充:

(最多只允许输入30个字)