我是 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/