
如何释放,保留和自动释放工作,它们的使用是什么约定?
(或者没有,你读了什么,帮助你得到它?)
解决方法 让我们从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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)