保留在目标c的概念

时间:2010-10-06 08:07:04

标签: iphone objective-c

我是目标c的新手......我知道分配和释放..... 但不知道何时以及为何使用保留声明...... 请帮助....只需要基本的想法...

还请讲一些关于复制声明.....

4 个答案:

答案 0 :(得分:7)

答案 1 :(得分:4)

retainrelease相反,而不是减少参考计数器,它会将其增加1。从NSArray中删除对象时,通常必须retain,因为删除它将导致在该对象上调用release。当您将对象的引用存储为其中一个类中的实例变量时,将使用retain。如果您使用的是属性,则会自动为您执行大多数retain次来电。

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

@property (retain) NSNumber* input;

会生成:

- (void) setInput: (NSNumber*)input
{
    [input autorelease];
    input= [input retain];
}

答案 2 :(得分: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稍微宽松一点意味着; “我不再需要这个对象,但要保留一段时间,以防有人想保留它”。您应该始终从您自己的方法中自动释放所有返回值。

答案 3 :(得分:1)

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