IOS:使用@property释放变量(非原子,保留)

nan*_*nda 4 ios

是否应显式释放具有@property非原子和保留的变量.

@interface MyScreenViewController : UIViewController <UIWebViewDelegate> {
    UIWebView* greetingView;
}

@property(nonatomic, retain) IBOutlet UIWebView* greetingView;

- (void)dealloc {
  [greetingView release];
}
Run Code Online (Sandbox Code Playgroud)

在delloc方法中发布是否必需???

ARC*_*ARC 5

当然.是的,你应该发布你的属性与保留,复制,而不是分配.您在viewDidUnload中将该属性设置为Nil.

- (void)viewDidUnload {
     [super viewDidUnload];

     self.greetingView = nil;
}

- (void)dealloc {
     [greetingView release],greetingView = nil;

     [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

请参阅UIViewController类参考中的内存管理:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

内存是iOS中的关键资源,视图控制器提供内置支持,以在关键时刻减少内存占用.UIViewController类通过didReceiveMemoryWarning方法提供一些自动处理低内存条件的方法,该方法释放不需要的内存.在iOS 3.0之前,此方法是释放与自定义视图控制器类关联的额外内存的唯一方法,但在iOS 3.0及更高版本中,viewDidUnload方法可能更适合大多数需求.

发生低内存警告时,如果UIViewController类知道它可以重新加载或稍后再次重新创建它们,则会清除它的视图.如果发生这种情况,它还会调用viewDidUnload方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括使用nib文件加载的对象,viewDidLoad方法中创建的对象以及懒惰创建的对象.运行时并添加到视图层次结构中.通常,如果视图控制器包含出口(属性或包含IBOutlet关键字的原始变量),则应使用viewDidUnload方法放弃这些出口的所有权或您不再需要的任何其他视图相关数据.

  • 实际上,当你调用self.greetView = nil时,该类被释放了.因为你用"self."调用它,它将运行合成方法setGreetView:它将为你发送release方法.因此,当它到达 - (void)dealloc方法*它已经被释放*并且当调用[greetView release]时,没有任何反应.但是,您希望保持代码*完全符合Nikita所描述的方式,因为在dealloc之前,viewDidLoad可能会被*调用.您的代码可能遵循不同的路径.所以你也必须在dealloc中发布. (3认同)