浅谈iOS方法体作用域中的堆和栈
2016-05-12 11:10
302 查看
在iOS函数体中,局部变量是放在栈中;
对象是放在堆中,该空间是动态分配的。
当程序检执行完某函数,程序就会跳出该函数的作用域,在栈中的局部变量会自动被回收;但是在堆中的对象需要程序员手动释放(现在ARC了,程序员不需要管理对象释放的问题了)
eg.在如下示例程序中,整型变量a、b和指针变量p都是放在栈中;当程序执行完main函数时,a、b、指针变量p会被释放。
但位于堆中的Person类的(实例)对象不会被释放。需要通过程序员手动释放,当没有任何指针指向该对象时(即:引用计数为0时,OC中通过引用计数的方式记录对象有没有被引用),应该向对象发送releass消息告诉对象要去释放了,对象在释放前会调用dealloc方法。
(JAVA中有垃圾回收机制可以自动检测并释放对象,很遗憾Object-C没有~~好在现在ARC了)
另外:程序为每个引用计数器分配4个字节的存储空间。
void main( )
{
int a = 10;
int b = 20;
Person * p = [[Person alloc] init];
}
对象是放在堆中,该空间是动态分配的。
当程序检执行完某函数,程序就会跳出该函数的作用域,在栈中的局部变量会自动被回收;但是在堆中的对象需要程序员手动释放(现在ARC了,程序员不需要管理对象释放的问题了)
eg.在如下示例程序中,整型变量a、b和指针变量p都是放在栈中;当程序执行完main函数时,a、b、指针变量p会被释放。
但位于堆中的Person类的(实例)对象不会被释放。需要通过程序员手动释放,当没有任何指针指向该对象时(即:引用计数为0时,OC中通过引用计数的方式记录对象有没有被引用),应该向对象发送releass消息告诉对象要去释放了,对象在释放前会调用dealloc方法。
(JAVA中有垃圾回收机制可以自动检测并释放对象,很遗憾Object-C没有~~好在现在ARC了)
另外:程序为每个引用计数器分配4个字节的存储空间。
void main( )
{
int a = 10;
int b = 20;
Person * p = [[Person alloc] init];
}
相关文章推荐
- iOS图像处理之画圆角矩形
- 视频 裁剪 合并 ios
- iOS 延长启动页时间
- IOS NSBundle的使用,注意mainBundle和Custom Bundle的区别
- iOS有三种多线程编程的技术
- IOS NSBundle 的理解和 mainBundle 类方法详解
- iOS AFNetWorking下同步异步请求
- genymotion VT-x is disabled in the bios for both all CPU modes
- iOS keyboard的types return变成什么样
- iOS 更改navigationcontroller pop出来的视图返回按钮
- iOS CoreLocation框架第二章—— CLLocationManagerDelegate全解
- iOS tabbar视图中隐藏tabbar
- iOS指定程序启动后初始的ViewController
- iOS实现图片的缩放和居中显示
- iOS中使用nil NULL NSNULL的区别
- iOS 引入支付宝 缺少 #include <openssl/asn1.h>
- iOS 集合的深复制与浅复制
- iOS服务器json数据中null的处理
- iOS 本地数据 存取 详解
- iOS开发之多线程—GCD介绍