【问题标题】:Which way is the correct way to allocate memory with a property?哪种方式是使用属性分配内存的正确方法?
【发布时间】:2011-09-12 23:34:45
【问题描述】:

哪种方式正确?

NSString *c = [[NSString alloc] init];
self.character = c;
[c release];

或

self.character = [[NSString alloc] init];

为什么?谢谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch cocoa ipad


    【解决方案1】:

    这取决于您的属性是如何声明的。如果你用过

    @property (nonatomic, retain) NSString *someString;
    

    将创建 setter 以保留 someString,在这种情况下,正确的方法是您的第一个方法。如果您使用过:

    @property (nonatomic, assign) NSString *someString;
    

    你的第二种方法是正确的,因为它只会分配指针而不保留任何东西。

    【讨论】:

      【解决方案2】:

      这取决于您如何定义您的属性。

      如果它是copy 或retain,则合成设置器(在您的示例中为setCharacter:)将获得您分配给该属性的任何对象的所有权。在这种情况下,您的第一个示例是正确的。第二个会导致内存泄漏,因为您两次声称拥有NSString 的所有权,而您(可能)只会放弃一次所有权;因此内存永远无法回收。

      另一方面,如果它是 assign,则 setter 不会做任何特别的事情,您的第二个示例将是正确的。如果您尝试对NSString 执行任何操作,第一个将导致EXC_BAD_ACCESS 错误。我应该注意,您通常只将assign 用于原始类型和委托。

      我建议您阅读 Objective-C 编程语言指南的 Memory Management Programming Guide 和 Declared Properties 部分。

      【讨论】:

        【解决方案3】:

        答案取决于您对@property 的定义。对于NSString,可能类似于(retain) 或(copy)。在这种情况下,分配给 self.character 将增加保留计数。所以底部:

        self.character = [[NSString alloc] init];
        

        您已使用 alloc 将保留计数设置为 1,并且 self.character 也会将其保留为 2,因此会泄漏。应该是

        self.character = [[[NSString alloc] init] autorelease];
        

        或顶级版本。

        【讨论】:

          【解决方案4】:

          现在使用 iOS 5 的答案是使用 ARC。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-02-11
            • 1970-01-01
            • 2011-05-11
            • 1970-01-01
            • 2012-01-22
            • 1970-01-01
            • 2019-07-11
            • 1970-01-01
            相关资源
            最近更新 更多