ios学习笔记之OC篇(二):引用计数
2013-12-02 15:28
288 查看
例题:已知存在属性@property (nonatomic,retain) NSArray *arr;该属性自动生成的set方法代码为:
-(void) setArr:(NSArray *)arr
{
_arr=arr;
[_arr retain];
}
[b]示例1:[/b]
@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。
-(void) setArr:(NSArray *)arr
{
_arr=arr;
[_arr retain];
}
[b]示例1:[/b]
@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。
相关文章推荐
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之17-内存管理和自动引用计数——黑马 IOS 技术博客
- iOS-学习笔记-内存管理 (1)自动引用计数
- 黑马程序员-ios学习笔记 oc 封装
- 黑马程序员-IOS学习笔记 OC @class的使用 解决循环引入
- 黑马程序员-ios学习笔记 oc 继承
- 黑马程序员————IOS学习笔记 第5篇 OC特殊语法 (1)
- iOS学习笔记---oc语言第三天
- 【Objective-C学习笔记】内存管理——ARC自动引用计数
- iOS学习笔记:Object-C基础语法(OC介绍与Foundation初步)
- iOS培训篇——OC 自动引用计数方法介绍
- iOS学习笔记---oc语言第八天
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift学习笔记之-自动引用计数
- com学习笔记(3)基本的com接口-引用计数的实现
- IOS 学习笔记 2015-03-20 OC-数值类型
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift学习笔记(七)自己主动引用计数
- com学习笔记(3)基本的com接口-引用计数的实现
- 黑马程序员-IOS学习笔记-OC基础OC类和对象
- 初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)