Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
“嵌套”;alloc";用Objective-C中的setter_Objective C_Iphone_Memory Management - Fatal编程技术网

“嵌套”;alloc";用Objective-C中的setter

“嵌套”;alloc";用Objective-C中的setter,objective-c,iphone,memory-management,Objective C,Iphone,Memory Management,这里的第一个问题是关于iPhoneOS3而不是MacOSX。我对Objective-C相当陌生,我从来没有在没有自动垃圾收集的环境中开发过,所以对此我有点困惑。以下是从Apple.com上的一个示例中为应用程序代理分配视图控制器的一些有效代码: MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBund

这里的第一个问题是关于iPhoneOS3而不是MacOSX。我对Objective-C相当陌生,我从来没有在没有自动垃圾收集的环境中开发过,所以对此我有点困惑。以下是从Apple.com上的一个示例中为应用程序代理分配视图控制器的一些有效代码:

MyViewController *aViewController = [[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];
所以,据我所知,我必须释放aViewController,因为它是第一次分配(+1=1);然后保留在设定器中(+1=2);然后在设定器中释放(-1=1);然后不再需要,所以最后再次释放(-1=0)并释放内存。Wel我不能跳过分配临时对象aViewController,然后像这样嵌套这些函数:

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];
我想知道这是否能正常工作?我有点担心,因为setter需要一个指向ViewController的指针,而不仅仅是一个ViewController的副本。既然我只传递一个返回值,那么setter中指向ViewController的指针是否会指向可能在赋值之前被擦除或丢失的数据?如果这看起来像一个愚蠢的问题,我很抱歉,但我很难在任何地方找到答案,我正在尝试为非垃圾收集环境建立良好的技术。谢谢

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];
在这里你分配,然后它被保留,所以你马上有一个保留计数2。但是它将被正确设置,因为您仍然向setter传递指向视图控制器的指针


如果属性MyViewController的类型为assign(非retain),则retain计数仅为1

不要从绝对保留计数的角度来考虑内存管理。完全从所有权和封装的角度来考虑它

当你
alloc
一个对象时,你已经创建了一个你自己的对象。将该对象设置为另一对象上的值时,该另一对象应保留该对象以表示所有权。如果您的代码对该对象不再感兴趣,那么您应该
释放它
(或者
自动释放它,如果您想将其返回到其他对象)


为了回答您的特定问题,假设
-setMyViewController:
实现正确,则上述代码本身将导致内存泄漏。

我认为此代码工作充分,不会导致内存泄漏:

MyViewController *aViewController = [[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];
[setMyViewController:aViewController];

谢谢大家的帮助

考虑保留计数的方式完全错误;永远不要认为他们是绝对的。如果你让某些东西被保留,当你不再拥有所有权时,你应该让它被释放(或自动释放)。没有更多,也没有更少。(我实际上没有编辑你的评论——只是做了足够多的空格更改来删除我不该投的反对票。)你应该发布你的
setMyViewController:
,正如bbum建议的那样。您的描述“然后保留在setter中(+1=2);然后在setter中释放(-1=1);”听起来非常可疑……setter看起来是这样的:@property(nonatomic,retain)MyViewController*MyViewController;如果我错了,请纠正我的错误,但我非常确定这会生成如下代码:-(void)setMyViewController:(MyViewController*)控制器{MyViewController=[controller retain];[controller release];}Peter Hosey在这里对对象所有权有一个很好的描述:setMyViewController是使用retain-then版本实现的,所以他们互相抵消了,对吗?由于我从来没有明确地为这些数据分配任何内存,我认为它可能不需要释放。那么我该如何解决这个问题呢?为什么
-setViewController:
会保留然后释放传入的视图控制器?发布代码,因为它听起来明显属于“未正确实现”类别。:)
MyViewController *aViewController = [[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];
[setMyViewController:aViewController];