我需要释放xib资源吗?

时间:2020-03-05 18:53:08  来源:igfitidea点击:

如果我有链接到xib文件的UILabel之类的东西,是否需要在取消分配视图时释放它?我问的原因是因为我没有分配它,这使我认为我也不需要释放它?
例如(在标题中):

IBOutlet UILabel *lblExample;

在执行中:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}

解决方案

回答

相关:了解可可/目标C的参考计数

回答

从某种意义上说,我们确实是通过在IB中创建标签来分配标签的。

IB的作用是查看IBOutlets及其定义。如果我们有一个类变量,IB将为其分配对某个对象的引用,则IB会为我们向该对象发送保留消息。

如果我们正在使用属性,则IB将利用我们必须设置值的属性,而不是明确保留该值。因此,我们通常会将IBOutlet属性标记为保留:

@property (nonatomic, retain) UILabel *lblExample;

因此,在以太坊的情况下(是否使用属性),我们应该在dealloc中调用release。

回答

我在Apple文档中找到了想要的东西。简而言之,我们可以将对象设置为要释放和保留的属性(或者仅@ property,@ synthesize),但不必使用UILabels之类的东西:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

回答

不需要释放作为Nib主视图的子视图的任何IBOutlet,因为在创建对象时会向它们发送自动释放消息。我们需要在dealloc中释放的唯一IBOutlet是顶级对象,例如控制器或者其他NSObject。上面链接到的Apple文档中都提到了这些。

回答

如果遵循现在认为是最佳实践的方法,则应释放出口属性,因为我们应将它们保留在集合访问器中:

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end

@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

这种方法的优势在于,它使内存管理语义清晰明了,并且可以在所有平台上针对所有nib文件一致地工作。

注意:以下注释仅适用于3.0之前的iOS。在3.0及更高版本中,我们应该只简单地在viewDidUnload中淘汰属性值。

不过,这里要考虑的一个问题是,何时控制器可以处置其用户界面并根据需要动态重新加载它(例如,如果我们有一个视图控制器从nib文件中加载视图,但是在请求时(例如在内存压力下)释放它,并期望如果再次需要该视图可以重新加载它)。在这种情况下,我们要确保在处置主视图时也放弃了其他所有网点的所有权,以便它们也可以被释放。对于UIViewController,我们可以通过覆盖setView:来解决此问题,如下所示:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

不幸的是,这引起了进一步的问题。由于UIViewController当前使用setView:访问器方法实现其dealloc方法(而不是直接直接释放变量),因此self.anOutlet = nil将在dealloc中被调用以及响应内存警告...这将导致dealloc崩溃。

补救措施是确保在dealloc中将出口变量也设置为nil:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}

回答

[anOutlet release], anOutlet = nil;

如果正确编写了setView:,那么部分将完全多余。

回答

如果不释放它就释放它会增加内存占用。

在此处查看有关工具ObjectAlloc图的更多详细信息