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