JoJ*_*oJo 10 iphone cocoa-touch memory-management objective-c
我整天都在阅读有关为什么在viewDidUnload中将视图设置为nil并在dealloc中发布的原因.所有文章都在重复同样的事情.是的,我知道幕后指示是不同的,但实际的区别是什么?
var = nil
[var release]
对我来说,回收内存的两种方式都有相同的最终结果.那么为什么一个在另一个呢?那里的每本书都告诉我设置为nil in viewDidUnload并释放dealloc.有人应该指出如果一个视图被释放viewDidUnload并被填入的话会发生的坏事dealloc.
.H
#import <UIKit/UIKit.h>
@interface DisclosureDetailController : UIViewController {
UILabel* label;
}
@property (nonatomic, retain) IBOutlet UILabel* label;
@end
Run Code Online (Sandbox Code Playgroud)
.M
#import "DisclosureDetailController.h"
@implementation DisclosureDetailController
@synthesize label;
- (void)viewDidUnload {
self.label = nil;
// OR [self.label release];
[super viewDidUnload];
}
- (void)dealloc {
[self.label release];
// OR self.label = nil;
}
Run Code Online (Sandbox Code Playgroud)
Lil*_*ard 25
首先,行
[self.label release];
Run Code Online (Sandbox Code Playgroud)
无论你在哪里打电话都是绝对错误的.你永远不应该调用-release属性访问的结果.这和写作完全一样[[self label] release],我希望你能认识到这是错误的.
您的代码示例应如下所示:
- (void)viewDidUnload {
self.label = nil;
[super viewDidUnload];
}
- (void)dealloc {
[label release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
如果我们先看一下-viewDidUnload,这很简单.self.label = nil;是正确的.同样正确的是[self setLabel:nil];.虽然不太好,但写作也是可以接受的[label release], label = nil;.最后一种形式并不是很好,因为它绕过了setter方法,这可能比简单地释放属性做更多的事情(例如,它可能保持关注属性值的内部状态).它还绕过了KVO通知.
这里真正的问题是你做了什么-dealloc.许多人认为这样说完全没问题self.label = nil;,实际上,这种方法大部分时间都可以使用.问题是,其余的时间会导致细微的错误.调用setter有两件事可以做.首先是它可以在你的类引起的副作用,如果setter方法是手动实现的(即使你不是你自己,一个子类可能实现的setter).第二是它可以播放KVO通知.当你进去的时候,这些都不是你想要的-dealloc.通过直接释放ivar,如同[label release];,您可以避免潜在的副作用和KVO通知.
| 归档时间: |
|
| 查看次数: |
4148 次 |
| 最近记录: |