首页 / 知识

关于iphone:我需要发布xib资源吗?

2023-04-15 07:08:00

关于iphone:我需要发布xib资源吗?

Do I need to release xib resources?

如果我有一个像UILabel链接到xib文件的东西,我是否需要在我的视图dealloc上发布它? 我问的原因是因为我没有分配它,这让我觉得我不需要释放它?
例如(在标题中):

1
IBOutlet UILabel *lblExample;

在实施中:

1
2
3
4
5
6
7
....
[lblExample setText:@"whatever"];
....

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

如果您遵循现在被认为是最佳实践的内容,则应该释放出口属性,因为您应该将它们保留在set访问器中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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:来处理此问题,如下所示:

1
2
3
4
5
6
- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

不幸的是,这引发了另一个问题。因为UIViewController当前使用setView:访问器方法实现其dealloc方法(而不是简单地直接释放变量),所以self.anOutlet = nil将在dealloc中调用以及响应内存警告...这将导致dealloc崩溃。

解决方法是确保出口变量也在dealloc中设置为nil

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

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

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


1
[anOutlet release], anOutlet = nil;

如果您正确编写了setView:part,则部分完全是多余的。


如果你不在dealloc上释放它会增加内存占用。

使用仪器ObjectAlloc图查看此处的更多详细信息


如果您不将IBOutlet设置为属性而仅将其设置为实例变量,则仍必须将其释放。这是因为在initWithNib上,将为所有IBOutlet分配内存。因此,即使您没有在代码中保留或分配任何内存,这也是您必须发布的特殊情况之一。


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


在某种意义上,您可以通过在IB中创建标签来分配标签。

IB的作用是查看您的IBOutlets及其定义方式。如果您有一个类变量,IB要为某个对象分配引用,IB将为您发送一条保留消息给该对象。

如果您正在使用属性,IB将使用您必须设置的属性而不显式保留该值。因此,您通常会将IBOutlet属性标记为保留:

1
@property (nonatomic, retain) UILabel *lblExample;

因此,在以太的情况下(使用或不使用属性),您应该在dealloc中调用release。


相关:使用Cocoa / Objective C了解引用计数


链接文件视图分配

最新内容

相关内容

猜你喜欢