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

标签 iphone objective-c

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

相关文章:

javascript - QuickConnect 与 Phonegap

iphone - 使用 iPhone 应用程序进行 Xcode 调试缓慢且滞后

iphone - ios: colorWithPatternImage ,拉伸(stretch)图像全屏

ios - POST 方法产生的状态代码 400 ios

ios - 如何将按钮操作作为直接命令执行

ios - 如何在 iOS 上以编程方式截取屏幕截图

iphone - 设备方向将改变而不是已经改变

iphone - 使用 UIApplication sharedApplication 调用电话

iOS 7 锁定屏幕的背景音频进度条不再有效

ios - 为什么此代码适用于 iPhone 5、4 和 4s 而不是 5s?