IOS:释放带有@property的变量(非原子,保留)

IOS:释放带有@property的变量(非原子,保留),ios,Ios,是否应该显式释放具有@property nonatomic和retain的变量 @interface MyScreenViewController : UIViewController <UIWebViewDelegate> { UIWebView* greetingView; } @property(nonatomic, retain) IBOutlet UIWebView* greetingView; - (void)dealloc { [greetingView

是否应该显式释放具有@property nonatomic和retain的变量

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

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

- (void)dealloc {
  [greetingView release];
}
@interface MyScreenViewController:UIViewController{
UIWebView*欢迎视图;
}
@属性(非原子,保留)IBUIWebView*greetingView;
-(无效)解除锁定{
[欢迎查看发布];
}

是否需要以delloc方法发布

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

Retain基本上就像一个类在说,“我要使用另一个类,所以把它放在内存中。”
dealoc
就是说这个类本身要从内存中删除的地方。因此,如果需要保留属性的类即将消失,那么该对象本身也应该被释放

否则它只是坐在那里的记忆,当程序中没有其他东西需要它。如果这种事情继续发生,你的记忆就会耗尽


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

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

- (void)viewDidUnload {
     [super viewDidUnload];

     self.greetingView = nil;
}

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

     [super dealloc];
}
请参阅UIViewController类参考中的内存管理:

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


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

在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描述的完全相同,因为在dealloc之前可能不会调用viewDidLoad。您的代码可能遵循不同的路径。因此,您还必须在dealloc中发布。在继续进行任何编码之前,您必须阅读以下内容: