【问题标题】:Under ARC, how do I release the elements in an NSArray?在 ARC 下,如何释放 NSArray 中的元素?
【发布时间】:2011-08-26 13:23:47
【问题描述】:

在标准的 Objective-C 手动内存管理下,this question 中建议释放使用初始化的 NSArray 的方式

imageArray  = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"], 
                        [UIImage imageNamed:@"2.png"],
                        nil];

要使用

[imageArray release];
imageArray = nil;

鉴于我们不再可以在自动引用计数下使用-release,建议在 ARC 下释放此 NSArray 的方法是什么?

【问题讨论】:

  • 请给您的问题一些实际内容,而不是仅仅链接到另一个问题并询问“如何使用 ARC 来做到这一点”
  • ARC下,不能只设置imageArray = nil;静态分析器将决定是否发布?
  • @BoltClock - 我相信这个问题可以独立存在。它只需要更好的措辞(我已经尝试提供)。

标签: objective-c ios automatic-ref-counting


【解决方案1】:

要使用 ARC,您只需删除您的 retainrelease 消息即可。所以你像这样摆脱你的数组:

 imageArray = nil;

这可行且不会泄漏,因为在 ARC 下,编译器会自动插入必要的 retainrelease 调用。

【讨论】:

    【解决方案2】:

    如果 imageArray 是对象的 ivar(也许不是一个安全的假设),您应该使用访问器将数组设置为 nil;访问器将负责释放数组及其所有成员:

    [self setImageArray:nil];

    如果您需要清理一个包含许多成员的数组,但在该 ivar 中准备好一个有效数组,以便其他方法可以安全地向它发送消息,您可以使用以下方法:

    [self setImageArray:[[NSArray alloc] init]];

    这将用新的空数组替换旧数组。

    【讨论】:

    • 说你保留了数组有点误导。你不是保留它,而是用一个新的空数组替换它。
    • "如果 imageArray 是一个对象的 ivar(也许不是一个安全的假设),您应该使用访问器将数组设置为 nil;访问器将负责释放数组和所有它的成员” ivar 与属性不同。每个属性都使用一个实例变量,但并非每个实例变量都使用一个属性。此外,在 ARC 下,您不需要属性来获得自动释放。只需将 ivar 设置为 nil(因此:imageArray = nil),编译器就会完成这项工作。 ;-)
    • 具有范围方法的数组怎么样,即为方法调用创建和生存?
    • @RandyMarsh,确切地说,并非每个属性都必须使用实例变量,例如一种具有自定义访问方法。
    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 2012-10-10
    • 1970-01-01
    • 2013-12-17
    • 2023-03-19
    • 2012-10-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多