gpt4 book ai didi

iphone - 方法中 ivar 数据的正确 NSArray 初始化

转载 作者:行者123 更新时间:2023-12-03 20:48:52 28 4
gpt4 key购买 nike

我是 Objective-C 和 iPhone 开发的新手,并且几周来一直在使用 Apress 的 Beginning iPhone 3 Programming 书籍作为我的主要指南。在少数情况下,作为 viewDidLoad: 方法的一部分,像 breadTypes NSArray 这样的 ivars 会像下面一样进行初始化,并定义一个中间数组,然后最终设置为实际数组,如下所示:

NSArray *breadArray = [[NSArray alloc] initWithObjects:@"White", @"Whole Weat", @"Rye", @"Sourdough", @"Seven Grain", nil];
self.breadTypes = breadArray;
[breadArray release];

为什么要这样做,而不是简单地这样:

self.breadTypes = [[NSArray alloc] initWithObjects:@"White", @"Whole Weat", @"Rye", @"Sourdough", @"Seven Grain", nil];

当我编译并运行它时,两者似乎都可以工作。上面的第二种方法是否没有进行适当的内存管理?我假设 initWithObjects: 返回一个保留计数为 1 的数组,并且我最终在 dealloc: 方法中再次释放 breadTypes,这样就很好地完成了:

- (void)dealloc {
...
[breadTypes release];
[super dealloc];
}

setter 通过标准属性(和最终合成)指令定义:

@property (nonatomic, retain) NSArray *breadTypes;

最佳答案

第二种方式确实可能会导致内存泄漏;您显式创建了一个数组(获取所有权),但没有释放它。

混合创建和赋值的最佳方法是使用类构造函数(请参阅 NSArray 引用)。当调用类构造函数时,您没有获得该对象的所有权,因此存在内存泄漏:

self.breadTypes = [NSArray arrayWithObjects:@"White", @"Whole Weat", @"Rye", @"Sourdough", @"Seven Grain", nil];

关于iphone - 方法中 ivar 数据的正确 NSArray 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2938103/

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