Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 帮助我理解为什么我不';不必分配此NSMutableArray_Iphone_Dealloc_Init - Fatal编程技术网

Iphone 帮助我理解为什么我不';不必分配此NSMutableArray

Iphone 帮助我理解为什么我不';不必分配此NSMutableArray,iphone,dealloc,init,Iphone,Dealloc,Init,在firstViewController中 SecondViewController *secondViewController = [[[SecondViewController alloc] init] autorelease]; // Pass data to secondViewController [secondViewController setClass1:anObjectFromFirstViewController]; [[self navigationController]

在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相同的对象,因此不需要分配

[self setObject2:[class1 someNSMutableArray]];
在init中,我不必分配object2,整个应用程序仍然可以工作。是因为object2指向内存中与
[class1 someNSMutableArray]
相同的项吗

如果是这样的话,那么如果我分配object2会发生什么呢。有两份吗?如果我初始化应用程序,它仍然可以正常工作

-(id)init { object2 = [[NSMutableArray alloc] init]; }
令人困惑的是,如果我用autorelease初始化,它会给我一个dealloc错误,一个释放的对象错误

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

非常感谢

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

[self setObject2:[class1 someNSMutableArray]];
object2是一个变量,它现在包含与[class1 someNSMutableArray]相同的地址。所以两者都指向同一个NSMutableArray对象

这与:

object2 = [[NSMutableArray alloc] init];
在本例中,您创建了一个新的NSMutableArray对象,并将该地址放入object2实例变量中。现在它指向的是一个不同于[class1 someNSMutableArray]的数组

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

至于内存管理:

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

我假设您(正确地)在这个类的-dealoc中发布了object2。因此,您有两个版本(dealloc中的版本加上此处的自动释放)而只有一个retain(来自alloc/init),因此您过度释放了对象。

很快,Class1和NSMutableArray是不同类型的对象,因此此代码看起来很危险。您上面的代码片段中没有足够的信息。setClass1:是否保留该对象?@ThomasW。很抱歉代码有点混乱。但是假设Class1有两个属性:NSMutableArray数组1,NSString字符串2。我正在将class1对象从firstViewCtrl传递到secondViewCtrl。然后,在secondViewCtrl中,我将secondView中的NSMutableArray设置为[ClassObject array1]。这有意义吗?我可能不太清楚。谢谢你的澄清。