自动释放与发布

She*_*lam 9 iphone cocoa-touch memory-management objective-c

鉴于这两种情况,哪种代码是最佳实践,为什么?

自动释放

loginButton = [[[UIBarButtonItem alloc] initWithTitle:@"Login" 
                                                style:UIBarButtonItemStylePlain 
                                                target:self 
                                                action:@selector(loginButtonClicked:)]
                                                autorelease];
self.navigationItem.rightBarButtonItem = loginButton;
Run Code Online (Sandbox Code Playgroud)

要么

发布

loginButton = [[UIBarButtonItem alloc] initWithTitle:@"Login" 
                                                style:UIBarButtonItemStylePlain 
                                                target:self 
                                                action:@selector(loginButtonClicked:)];
self.navigationItem.rightBarButtonItem = loginButton;
[loginButton release];
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 14

对于你的例子,它并不重要.就个人而言,我可能会使用第一种情况.这样可以让您以后添加修改或调试代码,而无需担心移动[loginButton release]线.

  • 不知道,可能只是一个感觉足够强大的人,在iPhone的所有情况下自动释放都是邪恶的.我给你+1,因为你实际上在考虑他发布的案例,而不仅仅是发表一揽子声明.因为我和你一样. (2认同)

Bri*_*ian 8

使用自动释放似乎有一种耻辱(即,尽可能优先释放),这就是我通常走第二条路线的原因.但是因为你不在这里循环,所以现在释放与后续自动释放将具有完全相同的效果(因为另一个对象保留了loginButton,它不会被dealloc()编辑).

但是我应该指出,我的大部分内存泄漏都是由于忘记添加释放线造成的,因此最好立即解决自动释放问题.

  • 在像iPhone这样的低内存设备上,最好在可能的情况下明确发布.它还使调试奇怪的EXC_BAD_ACCESS错误变得更容易,因为显式释放意味着您可以控制对象的生命周期. (3认同)