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

函数中的变量的作用域只能是在这个函数内,在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,目的是稍微延迟它的释放时间用来传给外面的对象,而不是函数结束时就释放。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值