IOS开发笔记12-Object-C中的对象与内存

转载请标明出处:
http://blog.csdn.net/hai_qing_xu_kong/article/details/53556243
本文出自:【顾林海的博客】

前言

Object-C的内存管理机制与java那种全自动的垃圾回收机制是不同的,它本质上还是c语言的手动管理方式,只不过稍微加了一些自动方法。

指针和指针的值

以下程序声明一个指向NSDate实例的变量:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSDate *today=nil;

        NSLog(@"%p",today);
    }
    return 0;
}

初始化指针变量为nil,程序输出0x0,这时在栈中的today变量值为0x0,而在堆上没有任何对象。

继续看下面实例:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSDate *today=[NSDate date];

        NSLog(@"%p",today);
    }
    return 0;
}

这时创建了一个NSDate实例,today指向这个实例,不再指向nil。堆上面保存着一个NSDate对象。

内存管理

栈是由有序的帧构成的,函数的帧在函数结束后会自动释放,而堆里的对象不会自动释放。因此管理堆很重要,程序占用堆大小是有限的。而每个对象被创建后都会占用一定的堆内存,如果系统内存不足,mac应用的运行效果就会变差,而ios应用就会崩溃。

当堆中的对象没有被引用,这时就应该销毁。

自动销毁不被引用的对象的机制称为ARC,ARC是自动引用计数的简称。每个对象都会对指向自己的指针进行计数,当引用计数为0时,就会认为不需要该对象了。如果项目开启了ARC,编译器会自动给项目添加代码来计算每个对象的引用数。

只要有一个指针指向对象,这个对象就会继续存在。因此调用free()函数来销毁对象是清理最干净的方法。如果不再需要某个对象,则可以将指向它的指针设置成nil,或者销毁它的指针。

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页