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

来源:互联网 发布:专业java培训学校 编辑:程序博客网 时间:2024/06/06 02:48
函数中的变量的作用域只能是在这个函数内,在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,目的是稍微延迟它的释放时间用来传给外面的对象,而不是函数结束时就释放。


0 0
原创粉丝点击