我整天都在阅读有关为什么在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) 我是Objective C的新手.我在许多iPhone/iPad应用程序中看到,在释放一个对象之后,它将被设置为nil.
[self.obj release]
self.obj = nil;
Run Code Online (Sandbox Code Playgroud)
我假设这样做是为了不让指针引用一个现在被释放的内存位置.现在假设以下情况:
//Thread #1 code
..some code
..some code
[self.obj release]
-------> Thread #2 runs //Thread #2 code
..some code
if (self.obj){
some code
}
self.obj = nil; <----- Thread #1 runs
Run Code Online (Sandbox Code Playgroud)
我想知道这种情况是否可能?如果是,是否有办法使释放/零原子?