gpt4 book ai didi

ios - NSMutableArray 从 viewDidLoad 初始化

转载 作者:行者123 更新时间:2023-11-29 11:01:21 26 4
gpt4 key购买 nike

arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]];

arrayOfElements = [[NSMutableArray alloc] init];
arrayOfElements = [someObj getArray];

有什么区别?

当第一个 arrayOfElementsnumberOfRowsInSection:(NSInteger)section 中返回计数时,它似乎没有丢失其对象,但第二个确实如此。当我以第二种方式执行时,我得到 EXC_BAD_ACCESS。

编辑:

我现在可以认为这是最好的方法吗,

arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];

因为我正在用autorelease'd 的内容初始化一个数组,现在我在当前类中有一个完全独立的数组,即viewDidLoad ,抱歉,ViewController

最佳答案

此行从现有数组创建一个 NSMutableArray

arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]];

这个组合首先创建一个 NSMutableArray,然后立即丢弃它,用 [someObj getArray] 返回的内容替换它

arrayOfElements = [[NSMutableArray alloc] init]; // Create new NSMutableArray
arrayOfElements = [someObj getArray]; // Throw away the newly created array and replace with the result of [someObj getArray]

如果您不使用 ARC,那么这两种方法都可以完全靠运气。

在这两种情况下,arrayOfElements 都被分配了一个autorelease'd 对象——它很快就会被清除(很可能是下一个运行循环)。纯属偶然,在此内存点上未写入任何其他内容,这使得您的一个实现仍然有效。


如果您没有使用 ARC,那么您真的应该更新您的项目以使用它,它将为您处理很多这样的情况。

您绝对应该使用属性(而不是裸 ivar),因为这将有助于减少内存问题(对于非 ARC)并为您的代码提供更一致的接口(interface)。

在您的 header (或类扩展)中声明这样的属性

@property (nonatomic, strong) NSMutableArray *arrayOfElements;

现在对于 ARC 你可以简单地做

[self setArrayOfElements:[[someObj getArray] mutableCopy];

对于非ARC你可以做

NSMutableArray *array = [[someObj getArray] mutableCopy];
[self setArrayOfElements:array];
[array release]; array = nil;

另请注意,getArray 是一个错误的方法名称。

The use of “get” is unnecessary, unless one or more values are returned indirectly. Coding Guidelines

关于ios - NSMutableArray 从 viewDidLoad 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15789721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com