iphone – 理解引用计数与Cocoa和Objective-C

iphone – 理解引用计数与Cocoa和Objective-C,第1张

概述我刚刚开始看看Objective-C和Cocoa,以使用iPhone SDK。我对C的malloc和自由概念相当舒服,但Cocoa的引用计数方案让我很困惑。我被告知这是非常优雅的,一旦你明白了,但我只是不是在驼峰。 如何释放,保留和自动释放工作,它们的使用是什么约定? (或者没有,你读了什么,帮助你得到它?) 让我们从retain和release开始; autorelease只是一个特殊的情况下, 我刚刚开始看看Objective-C和Cocoa,以使用iPhone SDK。我对C的malloc和自由概念相当舒服,但Cocoa的引用计数方案让我很困惑。我被告知这是非常优雅的,一旦你明白了,但我只是不是在驼峰。

如何释放,保留和自动释放工作,它们的使用是什么约定?

(或者没有,你读了什么,帮助你得到它?)

解决方法 让我们从retain和release开始; autorelease只是一个特殊的情况下,一旦你理解了基本概念。

在Cocoa中,每个对象跟踪它被引用的次数(具体来说,NSObject基类实现了这一点)。通过在一个对象上调用retain,你告诉它你想把它的引用计数加1。通过调用release,你告诉对象你正在放弃它,它的引用计数减少。如果在调用release之后,引用计数现在为零,那么该对象的内存被系统释放。

与malloc和free不同的基本方法是任何给定的对象不需要担心系统的其他部分崩溃,因为你释放了他们正在使用的内存。假设每个人都按照规则玩,并保持/释放,当一段代码保留然后释放对象时,引用对象的任何其他代码段将不受影响。

有时可能会混淆的是知道你应该调用保留和释放的情况。我的一般经验法则是,如果我想挂在对象上一段时间(如果它是一个类中的成员变量,例如),那么我需要确保对象的引用计数知道我。如上所述,通过调用retain来增加对象的引用计数。按照惯例,当使用“init”方法创建对象时,它也被递增(设置为1,真)。在这两种情况下,当我完成它时,我的责任是调用release对象。如果我不,会有内存泄漏。

对象创建示例:

Nsstring* s = [[Nsstring alloc] init];  // Ref count is 1[s retain];                             // Ref count is 2 - silly                                        //   to do this after init[s release];                            // Ref count is back to 1[s release];                            // Ref count is 0,object is freed

现在为autorelease。自动释放被用作方便的(有时是必要的)方式来告诉系统在一段时间后释放该对象。从管道的角度来看,当调用autorelease时,当前线程的NSautoreleasePool将被调用。 NSautoreleasePool现在知道一旦它获得机会(在事件循环的当前迭代之后),它可以调用对象上的释放。从我们的角度看,作为程序员,它需要关心为我们调用release,所以我们不必(事实上,我们不应该)。

重要的是要注意的是(再次,按照惯例)所有对象创建类方法返回一个自动释放的对象。例如,在以下示例中,变量“s”的引用计数为1,但在事件循环完成后,它将被销毁。

Nsstring* s = [Nsstring stringWithString:@"Hello World"];

如果你想挂在这个字符串上,你需要显式地调用retain,然后在你完成后显式释放它。

考虑下面(非常有用)的代码位,你会看到一个需要autorelease的情况:

- (Nsstring*)createHelloWorldString{    Nsstring* s = [[Nsstring alloc] initWithString:@"Hello World"];    // Now what?  We want to return s,but we've upped its reference count.    // The caller shouldn't be responsible for releasing it,since we're the    // ones that created it.  If we call release,however,the reference     // count will hit zero and bad memory will be returned to the caller.      // The answer is to call autorelease before returning the string.  By     // explicitly calling autorelease,we pass the responsibility for    // releasing the string on to the thread's NSautoreleasePool,which will    // happen at some later time.  The consequence is that the returned string     // will still be valID for the caller of this function.    return [s autorelease];}

我意识到所有这一点有点混乱 – 在某些时候,虽然,它会点击。这里有几个参考,让你去:

> Apple’s introduction到内存管理。
> Cocoa Programming for Mac OS X (4th Edition),由Aaron Hillegas – 一本非常好的书,有很多很好的例子。它读起来像一个教程。
>如果你真的潜水,你可以去Big Nerd Ranch.这是一个由Aaron Hillegas运行的训练设施 – 上述书的作者。我参加了几年前的Cocoa课程介绍,这是一个很好的学习方式。

总结

以上是内存溢出为你收集整理的iphone – 理解引用计数与Cocoa和Objective-C全部内容,希望文章能够帮你解决iphone – 理解引用计数与Cocoa和Objective-C所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1049270.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存