【问题标题】:IOS : Releasing variable with @property (nonatomic, retain)IOS:使用@property 释放变量(非原子,保留)
【发布时间】:2011-10-07 10:22:52
【问题描述】:

是否应该明确释放带有@property nonatomic 和 retain 的变量。

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

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

- (void)dealloc {
  [greetingView release];
}

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

【问题讨论】:

标签: ios


【解决方案1】:

当然。是的,您应该使用保留、复制和不分配来释放您的属性。您在 viewDidUnload 中将该属性设置为 Nil。

- (void)viewDidUnload {
     [super viewDidUnload];

     self.greetingView = nil;
}

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

     [super dealloc];
}

参考 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 方法放弃这些出口或您不再需要的任何其他与视图相关的数据的所有权。

【讨论】:

  • 在 viewDidUnload self.greetingView = nil; 中设置,然后调用 delloc 并执行释放。但变量值为零。这是否按预期工作?
  • 如果一个消息在一个类的值为 nil 时被调用,它什么也不做并返回 nil。所以如果 greetingView 为 nil,[greetingView release] 什么也不做。这没问题。
  • 是的...那我们还没有释放它...因为它设置为nil,在调用dealloc之前。如上图。
  • @nanjunda 这是正确的做法。请参阅内存管理指南。将属性设置为 nil 会释放它并设置为 nil。
  • 其实这个类是在你调用self.greetView = nil的时候释放的。因为你用“self.”来调用它,它会运行合成方法 setGreetView:,它会为你发送 release 方法。所以当它到达 -(void)dealloc 方法时它已经被释放并且当 [greetView release] 被调用时,什么也没有发生。但是,您希望保持代码完全按照 Nikita 所描述的方式,因为 viewDidLoad 可能在 dealloc 之前不会被调用。您的代码可能遵循不同的路径。所以你还必须在 dealloc 中释放。
【解决方案2】:

是的,您应该释放它,因为它是保留财产。任何保留(或复制)的属性都应该由同一个类释放(如果已分配,则不需要释放)。

Retain 基本上就像一个类说,“我将使用这个其他类,所以把它放在内存中。” dealloc 是表示该类本身将从内存中删除的位置。因此,如果需要保留属性的类即将消失,则该对象本身也应该被释放。

否则,它只会留在内存中,而程序中没有其他东西需要它。如果这种事情一直发生,你的内存就会耗尽。

(另外,请确保在您的 dealloc 方法结束时调用 [super dealloc]。)

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多