关于函数返回值作用域的一些思考
来源:互联网 发布:专业java培训学校 编辑:程序博客网 时间:2024/06/06 02:48
函数中的变量的作用域只能是在这个函数内,在arc环境内,例如,
输出的view的宽度是100,而不是0,假如函数结束时view的内存计数器立马减1,那么当执行完view = nil;后view的内存计数应该只有0了,无法输出view的宽度是100,这说明当结束这个函数时,view的计数并没有立刻就减1,而应该是把它放入了自动释放池,也就是非arc中的 return [view autorelease];这个只适用于函数内被返回的变量,对于不被返回的变量,因为它的作用域只在这个函数内,所以在arc环境下,当函数结束时,这个变量就回release一次,如下测试代码:
- (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
- 关于函数返回值作用域的一些思考
- 关于函数返回值的设计的一些思考
- 关于函数返回值的一点思考
- 关于C#间接继承的一些思考:如何修改继承函数的返回值类型
- 关于函数返回值的一些理解
- 关于函数返回值的一些见解
- 关于中断服务函数带来返回值的思考
- 关于C++函数调用(返回)传值的思考!
- 关于静态函数的一些思考
- 关于静态函数的一些思考
- 关于静态函数的一些思考
- C++关于内联函数的一些思考
- 关于Javascript函数的一些思考(一)
- 关于激励函数的一些思考
- 关于核函数的一些思考
- 关于损失函数的一些思考
- 关于函数的返回值的一些困惑和解释
- 关于返回引用的思考
- Factorization Machines 学习笔记(四)学习算法
- windows下安装Apache24
- OpenCV 无法启动此程序,因为计算机中丢失opencv_core249.dll。请尝试重新安装改程序已解决此问题
- C#中串口通信编程
- Linux命令总结
- 关于函数返回值作用域的一些思考
- Java导入工程文件问题
- c#注释规范
- LeetCode | Minimum Depth of Binary Tree
- Android 6大开源框架
- solr源码导入eclipse
- appframework基础 : 二、定义header
- 1045 - Access denied for user ' xxxx '@'localhost' (using password :YES)
- 服务器端向Android客户端传值——登录实现(二)