相关疑难解决方法(0)

在viewDidUnload中设置为nil,但在dealloc中释放

我整天都在阅读有关为什么在viewDidUnload中将视图设置为nil并在dealloc中发布的原因.所有文章都在重复同样的事情.是的,我知道幕后指示是不同的,但实际的区别是什么?

var = nil

  1. 如果var是保留的属性,则回收旧对象var指向的内存.
  2. 将var设置为nil.

[var release]

  1. 回收内存var点.
  2. var现在指向什么,相当于零

对我来说,回收内存的两种方式都有相同的最终结果.那么为什么一个在另一个呢?那里的每本书都告诉我设置为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)

iphone cocoa-touch memory-management objective-c

10
推荐指数
1
解决办法
4148
查看次数

应该释放一个对象并将其设置为nil是原子的吗?

我是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)

我想知道这种情况是否可能?如果是,是否有办法使释放/零原子?

multithreading cocoa-touch objective-c ios

1
推荐指数
1
解决办法
144
查看次数