2009-11-02 68 views

回答

29

我认为这是提请你注意的事实,正在使用assign,而不是retaincopy。由于NSString是一个对象,因此在引用计数的环境中(即没有垃圾收集),这可能是潜在的“危险”(除非它是有意设计的)。

然而,assignretaincopy之间的区别如下:

  • 分配:在该属性的setter方法,还有就是你的实例变量的简单分配到新的价值例如:

    - (void)setString:(NSString*)newString 
    { 
        string = newString; 
    } 
    

    这可以通过不保留该对象会导致问题,因为Objective-C对象使用引用计数,并且因此,有机会该字符串可以在您仍在使用时释放。

  • 保留:此保留在setter方法的新值。例如:

    - (void)setString:(NSString*)newString 
    { 
        [newString retain]; 
        [string release]; 
        string = newString; 
    } 
    

    这是比较安全的,因为你明确说明要保持对象的引用,你必须释放它,它就会被释放之前。

  • 副本:这使得该字符串的一个副本在你的setter方法:

    - (void)setString:(NSString*)newString 
    { 
        if(string!=newString) 
        { 
         [string release]; 
         string = [newString copy]; 
        } 
    } 
    

    这通常被用来处理字符串,因为制作原始对象的副本,确保它不会改变,而你正在使用它。

10

Cocoa使用引用计数来管理内存。引用计数为0的对象被删除。

  • 分配 - 什么都不做引用计数仅指向您的变量的数据
  • 保留 - 指向您的变量数据,并增加了1引用计数,保证数据在那里,而你的变量仍然活着
  • 副本 - 让数据的副本,点你的变量它,使保留计数1个

更多细节here,在苹果自己的文档。

+1

retain - __even if__ someone [deallocs]你正在引用的NSString?或者只有同一个实例的每个用户[发布]才能工作? – bobobobo 2009-11-02 18:23:43

+1

@bobobobo - 你应该*不要*调用'dealloc'自己。你应该总是使用'release'或'autorelease'。 – 2009-11-02 18:24:38

+0

戴夫说什么。您的数据得到保证的原因是因为您认为其他人只使用版本,仅通过引用降低引用计数。如果其他人,或者你自己,通过dealloc或释放一个对象(从而不遵守规则),你的数据不能保证! – bmalicoat 2009-11-02 18:28:48

3

assign - ivar通过做一个简单的任务设置。执行:

- (void) setFoo:(NSString *)newFoo { 
    foo = newFoo; 
} 

retain - 伊娃在做任务之前发送的保留消息。执行:

- (void) setFoo:(NSString *)newFoo { 
    if (foo != newFoo) { 
    [foo release]; 
    foo = [newFoo retain]; 
    } 
} 

copy - ivar在进行分配前发送复制消息。实现:

- (void) setFoo:(NSString *)newFoo { 
    if (foo != newFoo) { 
    [foo release]; 
    foo = [newFoo copy]; 
    } 
} 
+1

这些不是实际实施方式中,编译器@synthesizes,但是从(非GC)存储器管理透视演示行为。 – 2009-11-02 18:19:09

+0

@尼古拉 - 是的,谢谢澄清。 – 2009-11-02 18:22:32

相关问题