您的位置:首页 > 其它

关于函数返回值作用域的一些思考

2014-10-28 09:55 274 查看
函数中的变量的作用域只能是在这个函数内,在arc环境内,例如,
- (UIView * )method{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 40.0f)];
return view;
}

view的作用域只能在这个函数内,所以按理说应该在函数结束后就会将view的内存计数减一,但是实际上并不是这样,如下测试代码:

- (void)viewDidLoad {
[super viewDidLoad];
UIView * view = [self method];
UIView * __weak view2 = view;
view = nil;
NSLog(@"%f",view2.bounds.size.width);
}
- (UIView * )method{ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 40.0f)]; return view; }


输出的view的宽度是100,而不是0,假如函数结束时view的内存计数器立马减1,那么当执行完view = nil;后view的内存计数应该只有0了,无法输出view的宽度是100,这说明当结束这个函数时,view的计数并没有立刻就减1,而应该是把它放入了自动释放池,也就是非arc中的 return [view autorelease];这个只适用于函数内被返回的变量,对于不被返回的变量,因为它的作用域只在这个函数内,所以在arc环境下,当函数结束时,这个变量就回release一次,如下测试代码:

- (void)viewDidLoad {
[super viewDidLoad];
NSObject *obj = [[NSObject alloc] init];
NSObject * __weak obj2 = obj;
UIView *  view = [self method:obj];
obj = nil;
if (obj2 == nil) {
NSLog(@"obj被释放了");
}
}
- (UIView * )method:(NSObject * __strong)obj{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 40.0f)];
return view;
}

在method函数内有一个局部变量obj ,当函数结束时就回把它release一次,所以当ViewDidLoad中的obj设置为nil的时候就被立即释放了(NSLog被执行).

总结:在函数作用域结束时需要处理对象的引用计数,假如是不需要返回的对象,可以直接release,而假如是需要返回的对象,处理方法是autorelease,目的是稍微延迟它的释放时间用来传给外面的对象,而不是函数结束时就释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: