【问题标题】:Returning an NSArray without Leaking?返回一个不泄漏的 NSArray?
【发布时间】:2010-06-22 00:23:13
【问题描述】:

我一直在努力寻找从静态方法返回数组的最佳模式。

在我的静态方法 getList(在 BIUtility 类中)中,我分配了一个 NSArray 来返回。在返回线,我这样做:

return [array autorelease];

然后在调用方法中,我分配一个这样的数组:

NSArray * list = [[[NSArray alloc] initWithArray:[BIUtility getList]] retain];

稍后我使用以下命令发布列表:

[list release];

我认为这会导致内存泄漏,因为保留将保留计数增加了太多。但是,如果我不保留,我会得到一个 Bad_Exec,因为它已经释放了类。

我觉得我想太多了,必须有一个典型的模式。我一直在寻找所有地方,但找不到“最佳实践”。

感谢您的帮助。

【问题讨论】:

    标签: objective-c memory-leaks


    【解决方案1】:

    你应该替换:

    NSArray * list = [[[NSArray alloc] initWithArray:[BIUtility getList]] retain];
    

    与:

    NSArray * list = [[BIUtility getList] retain];
    

    这是因为getList实际上返回了一个指向NSArray的指针。

    然而,如果它是一个可变数组,你应该说[[BIUtility getList] copy];,这样你就不会意外地改变另一个对象引用的数组。

    如果您好奇,您会遇到内存泄漏,因为您的原始语句增加了两个计数器,而您稍后才释放一个。

    语句的这些部分增加计数:

     [anObject]] retain]
     [anClassname alloc]
    

    [anObject copy] 也会创建一个计数为 1 的对象。

    【讨论】:

    • 我这样做了,但后来我收到了 EXC_Bad_Instruction 消息,因为它正在尝试对已经释放的对象进行释放。我不需要对保留对象进行显式释放吗?
    • @Michael:你最初是如何声明数组的?
    • 像这样... NSArray *moveList = [[NSArray alloc] init];有时我必须使用 NSMutableArray,因为我是从 SQL 查询构建它,但我返回一个 NS Array。
    • 如果声明is为[alloc],则返回为[autorelease],然后在调用方法时[ret​​ain],应该可以一直使用到下次释放.如果您在设置后仍然遇到问题,则它在您的程序中的其他地方。
    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多