Iphone 目标C中的内存分配

Iphone 目标C中的内存分配,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我有一个简单的问题。我指的是apple的“您的第一个iOS应用程序”文档。我发现该类有一个名为myViewController的属性: @interface applicationClass { MyViewController *myViewController } 现在要为该指针分配内存,代码如下: MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@"M

我有一个简单的问题。我指的是apple的“您的第一个iOS应用程序”文档。我发现该类有一个名为myViewController的属性:

@interface applicationClass
{
   MyViewController *myViewController
}
现在要为该指针分配内存,代码如下:

MyViewController *aViewController = [[MyViewController alloc]
            initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];
我的疑问是,如果这样做有什么错:

self.myViewController = [[MyViewController alloc]
            initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

我找不到这种直接在许多文档中分配属性的实例化。而是分配一个临时内存,然后由属性保留它。如果我错了,有谁能指导我吗?

这样,你就两次保留了你的目标:自我。(如果您在couse的属性中设置了retain)和[MyViewController alloc]。您只想保留对象一次….

如果调用名称中包含
alloc
copy
的方法,则会得到保留计数为+1的对象,因此您有责任在使用后释放它

现在,如果您分配给定义为
@property(retain,…)
的属性,那么@synthesis'd方法将确保正确调用retain和release。因此,如果您执行
self.foo=bar
,则bar的保留计数将增加1

这里,您从alloc/init获得了一个retaincount为1的对象。然后将其指定给属性,保留计数上升到2,这太高了(对它的引用只有一个,而不是两个)。两种解决方案:要么是您引用的第一个代码块,它将对象存储在一个变量中,然后可以调用release立即将retain计数再次“修复”为1。或者,您可以这样做:

self.myViewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];

autorelease
将确保稍后对对象调用
release
,从而再次“修复”保留计数。您不能在此处用release`替换
autorelease',因为保留计数在分配给属性之前会下降到0,因此在传递给属性之前它会被释放。

如果我这样做,我会将对象保留在self中(假设我在属性中设置了retain)。但是[[MyViewController]alloc]如何导致另一个保留?当我说[anObject alloc]时,内存被分配给该对象,并分配给负责相同权限的任何指针?请你详细说明第二点好吗?非常感谢你快速详尽的回答。我很明白。然而,这是一个小小的疑问。在我上面提到的情况下,由于内存的唯一所有者是self.myViewController,并且它的retain计数为2,我可以释放它两次来解决相同的问题吗?我知道这是一个令人毛骨悚然的问题,但我只是想知道这在技术上是否可行!是的,您可以执行self.foo=[[Bar alloc]init];[self.foo发布]
以获得1的保留计数(如果释放两次,计数将为0,并且对象将被释放,这不是您想要的,因为变量/属性仍将指向该内存位置并认为它处于活动状态,从而导致故障和崩溃)。我从未见过这种情况,因为大多数Obj-C开发人员似乎本能地在这里使用
autorelease
,或者在您的第一个代码示例中使用手动方法,但我不认为这种解决方案有任何错误。