gpt4 book ai didi

iphone - 未使用的 IBOutlets 泄漏

转载 作者:行者123 更新时间:2023-12-03 21:22:42 25 4
gpt4 key购买 nike

所以,我通过 XIB 文件加载,它包含一组 UIBarButtonItems。调用 viewDidLoad: 时会使用某些项目。

@interface MyViewController : UIViewController  {

IBOutlet UIBarButtonItem *addButton;
IBOutlet UIBarButtonItem *editButton;
IBOutlet UIBarButtonItem *doneButton;
}

// NB: There are no properties retaining anything.

@end

@implementation MyViewController

- (void)viewDidLoad {

[super viewDidLoad];

NSArray *initialToolbarItems =
[[NSArray alloc] initWithObjects: addButton, editButton, nil];

self.toolbarItems = initialToolbarItems;
[initialToolbarItems release];
}

- (void)dealloc {
[super dealloc];

// Nothing else to do here since we are not retaining anything.
// … or are we? <insert dramatic music here>
}

@end

如果我将上面的 ViewController 推到 UINavigationController 上,一切看起来都很好,所有 IBOutlet 都被分配并且表现得像预期的那样。

当我从导航堆栈中弹出 ViewController 时,Instruments' Leaks 告诉我,我正在泄漏 UIBarButtonItem。祸哉我!

如果我将 dealloc: 更改为

- (void)dealloc {
[doneButton release];
[super dealloc];
}

没有发生泄漏。如果我在 viewDidLoad:

中使用 doneButton ,情况也是如此
  NSArray *initialToolbarItems = 
[[NSArray alloc] initWithObjects: addButton, editButton, doneButton, nil];

我的问题:为什么我的 IBOutlet 在不使用时会泄漏。我在任何时候都不会保留它。 NIB 加载器应该拥有该对象,对吧?

最佳答案

我唯一能想到的是:

nib 加载器将 IBOutlet 视为强引用。除非您特别指定分配,否则默认情况下保留所有导出。所以你仍然需要在dealloc和viewDidUnload中释放它们。

您还可以使用指定的属性使其成为弱引用:

@property (nonatomic, assign) IBOutlet UIBarButtonItem *doneButton;

一些阅读:http://weblog.bignerdranch.com/?p=95

关于iphone - 未使用的 IBOutlets 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3290348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com