[英]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.