Objective-C 内存管理

本文详细介绍了Objective-C的内存管理,包括alloc与dealloc、引用计数、autorelease、内存泄漏及多线程中的内存管理。Objective-C使用引用计数来跟踪对象,alloc创建对象后需要通过release或autorelease来释放内存。在ARC模式下,使用dealloc和finalize方法不同。文章还讨论了字符串处理、类成员变量的内存管理以及自动释放池的工作原理。
摘要由CSDN通过智能技术生成

声明
欢迎转载,但是请尊重作者劳动成果,转载请保留此框内声明,谢谢。
文章出处:http://blog.csdn.net/iukey




大概是因为 Objective-C 是 C的超集,所以Objective-C 也使用alloc来申请内存,不同的是C调用free来直接释放内存,而Objective-C 不直接调用dealloc来释放内存。整个Objective-C 都使用对象的引用,而每个对象都有一个引用计数器。当计数器为0时,系统调用dealloc来释放内存。Objective-C 业提供了autorelease 属性,从而可以让系统自动释放对象所占有的内存。程序中可以设置一个自动释放池,系统使用这个池来跟踪对象。使用如下语句可以创建一个自动释放池:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];

在我们的程序入口处,xcode也帮我们建了一个自动释放池,而且把整个程序循环加了进去。

int main(int argc, char *argv[])
{
    @autoreleasepool {//这个说实话我也没搞明白,不过我知道它创建了一个自动释放池,然后把我们的程序放到了这个池子里
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}//先别管这个的具体意思,你只要知道xcode帮我们建了一个自动释放池,然后把整个程序放到了自动释放池里面。
在这个 自动释放池建立之后,基础框架就自动将数组、字符串等对放到这个池中。当下面语句被执行时,池中的对象就被自动释放:
[ pool drain];
总之,一个对象被标识为自动释放对象,那么就会被加到自动释放池中。除了使用drain来释放池中的对象外,在自动释放池本身被释放时,池中的所有对象也会被释放。自动释放池语句如下:
[ pool release ];

之前是没有ARC(Automatic Reference Counting)功能的,现在有了,我想ARC 主要是为从Java转过来的程序员而设计的吧,因为这个差不多相当于Java里面的自动垃圾收集器吧。从C/C++转过来的程序员大多数还是愿意手动去释放的,因为他们不大相信自动释放的效率,还有就是他们喜欢掌控一切的感觉,比如我。如果你要开启,在创建工程的时候请勾选上这个选项:

如果你使用手动管理内存,请往下看:

一、申请内存(alloc)

当使用 alloc 创建了一个对象时,需要在用完这个对象后释放(release)它,你不需要自己去释放一个被设置为自动释放(autorelease)的对象,如果你真的这么干了,对不起,程序会崩溃。

   //str1 是autorelease的,会自动释放
    NSString* str1 = [NSString string];
    //str2需要手动释放
    NSString* str2 = [[NSString alloc]init];
    //str2 使用完后
    [str2 release];
为便于理解,你可以理解成autorelease型的对象会在该释放他的时候自动释放。

二、释放内存(dealloc)

当一个对象从内存上删除之前,系统就会调用dealloc方法,这是释放对象成员变量的最好时机。比如:

- (void)dealloc{
    [_window release];
    [super dealloc];
}
上例中,先调用release释放了成员变量_window所占用的内存。相对而言,用标准的release比autorelease更快一点。最后一行[ super dealloc ]; 非常重要,必须调用这个方法让父类清楚它自己,否则会造成内存泄漏。

在ARC模式下,dealloc 不会被调用到,取而代之的是,需要实现finalize方法 。

三、引用计数器(retainCout)

整个Objective-C都使用对象引用,而每个对象有一个引用计数器。当时用alooc(或copy)方法创建一个对象时。其计数器的值为 1 。当计数器为 0 时,系统自动调用 dealloc方法来释放内存中的对象。比如:

STU *stu = [[STU alloc]init];//计数器为1
    [stu retain];//计数器为2
    [stu release];//计数器为1
    [stu release];//计数器为0,系统自动调用dealloc方法
    //释放之后,如果调用该对象的任何一个方法,程序就会异常终止
    [stu goHiking];//崩溃
为了防止上述的异常崩溃出现,可以在最后一个release之后加一句:
 stu =nil;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值