目标 c 中的保留概念

Posted

技术标签:

【中文标题】目标 c 中的保留概念【英文标题】:concept of retain in objective c 【发布时间】:2010-10-06 08:07:04 【问题描述】:

我是objective c的新手.....我知道alloc和release..... 但不知道何时以及为什么要使用retain语句...... 请帮忙....只需要基本的想法...

也请说说copy statement.....

【问题讨论】:

【参考方案1】:

您应该阅读以下内容:http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

【讨论】:

【参考方案2】:

retainrelease 相反,它不是减少引用计数器,而是将其增加一。当你从一个 NSArray 中移除一个对象时,你通常需要retain,因为移除它会导致在该对象上调用release。当您将对象的引用作为实例变量存储在您的某个类中时,使用保留。如果您使用属性,大多数retain 调用将自动为您完成。

对于正确的内存管理,重要的是每个retain 都需要有一个release,否则会造成内存泄漏。

@property (retain) NSNumber* input;

会产生:

- (void) setInput: (NSNumber*)input

    [input autorelease];
    input= [input retain];

【讨论】:

【参考方案3】:

retain的概念是英文单词的确切含义;你想让物体粘在周围。

按照惯例,您可以访问的几乎所有对象,无论是返回值还是您的方法参数,都是自动释放的。这意味着它们将在稍后的某个时间“收集垃圾”,其中 “稍后的某个时间” 是在当前方法退出后不久。

所以如果你想让对象在当前方法退出后仍然存在,那么你需要retain对象。您访问过的所有对象都自动释放并且会消失,除非您明确调用retain,或者从包含以下任何词语的方法中获取它们:

alloc copy new

方法名中的这三个词暗示了retain。两个保留对象的示例:

Foo* foo = [[Foo alloc] init];
Foo* bar = [foo copy];

不保留对象的示例:

Foo* foo = [Foo fooWithInt:42];
Bar* bar = foo.bar;

release是反义词,是手段; “我不再需要该对象,它可以立即丢弃”

autorlease 稍微宽松一点,意味深长; “我不再需要该对象,但请保留一段时间以防有人想要保留它”。您应该始终自动释放您自己方法的所有返回值。

【讨论】:

【参考方案4】:

试试this Objective-C introductory article for Java programmers ,它可以很好地解释这一点。

【讨论】:

以上是关于目标 c 中的保留概念的主要内容,如果未能解决你的问题,请参考以下文章

目标 C NSString 保留

目标 C - 因保留周期而丢失

未保留目标 C 变量值

目标 c 泄漏 NSNumber 被保留

如何在目标c中保留方法之外的数组

在目标 c ios 中保留 viewDidLoad 之外的数据