NSString没有指定'assign','retain'或'copy'属性

bob*_*obo 13 memory-management objective-c nsstring

我在一个类中声明了一个NSString属性,而且Objective-c抱怨:

NSString没有指定'assign','retain'或'copy'属性

然后随便让我知道"使用"分配".

有人可以向我解释正常C内存管理功能方面的分配,保留复制之间的区别吗?

Ale*_*ski 31

我认为它引起你的注意,assign正在使用a,而不是retaincopy.由于a NSString是一个对象,在引用计数环境中(即没有垃圾收集),这可能是"危险的"(除非它是故意的设计).

然而,之间的区别assign,retain以及copy如下:

  • assign:在属性的setter方法中,可以将实例变量简单分配给新值,例如:

    - (void)setString:(NSString*)newString
    {
        string = newString;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 保留:这会在您的setter方法中保留新值.例如:

    - (void)setString:(NSString*)newString
    {
        [newString retain];
        [string release];
        string = newString;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样更安全,因为您明确声明要维护对象的引用,并且必须在它被释放之前释放它.

  • copy:这会在setter方法中生成字符串的副本:

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

    这通常与字符串一起使用,因为制作原始对象的副本可确保在使用它时不会更改它.


bma*_*oat 10

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

  • assign - 无需引用计数只需将变量指向数据即可
  • retain - 将您的变量指向数据并将1加到引用计数,当您的变量仍然存活时,数据保证存在
  • copy - 创建数据副本,将变量指向它并使保留计数为1

有关详细信息,请参阅Apple自己的文档.