繁体   English   中英

帮助我理解为什么我不必分配这个 NSMutableArray

[英]Help me understand why I don't have to allocate this NSMutableArray

在 firstViewController 中,

SecondViewController *secondViewController = [[[SecondViewController alloc] init] autorelease];
// Pass data to secondViewController
[secondViewController setClass1:anObjectFromFirstViewController];
[[self navigationController] pushViewController:secondViewController ...];

SecondViewController.m

Class1 *class1;
NSMutableArray *object2;

在 viewDidLoad 中,我认为 object2 指向与 class1 相同的 object,因此不需要分配。

[self setObject2:[class1 someNSMutableArray]];

在 init 中,我不必分配 object2 并且整个应用程序仍然可以工作。 是不是因为 object2 指向 memory 中与[class1 someNSMutableArray]相同的项目。

如果是这种情况,那么如果我分配 object2 会发生什么。 会有2份吗? 如果我初始化它,该应用程序仍然可以正常工作。

-(id)init { object2 = [[NSMutableArray alloc] init]; }

令人困惑的部分是,如果我使用 autorelease 进行初始化,它会给我一个 dealloc 错误,即解除分配到已发布的 object 错误

-(id)init { object2 = [[[NSMutableArray alloc] init] autorelease]; }

非常感谢!!!

您对问题第一部分的想法是正确的。

[self setObject2:[class1 someNSMutableArray]];

object2 是一个变量,现在包含与 [class1 someNSMutableArray] 相同的地址。 所以两者都指向同一个 NSMutableArray object。

这不同于:

object2 = [[NSMutableArray alloc] init];

在这种情况下,您创建了一个新的 NSMutableArray object 并将地址放入 object2 实例变量中。 所以现在指向一个不同于 [class1 someNSMutableArray] 的数组。

那里的关键词是“创造”。 将 alloc/init 视为创建一个新的 object。

至于memory管理:

object2 = [[[NSMutableArray alloc] init] autorelease];

我假设您正在(正确地)为这个 class 在 -dealloc 中释放 object2。 所以你有两个版本(在 dealloc 中的版本加上这里的这个 autorelease)只有一个保留(来自 alloc/init),因此你过度释放了 object。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM