【问题标题】:Need help fixing iPhone memory leaks!需要帮助修复 iPhone 内存泄漏!
【发布时间】:2011-03-27 09:43:56
【问题描述】:

我在 iPhone 设备上执行以下代码时遇到了一些奇怪的内存泄漏:

@implementation TestViewController
@synthesize myButton;

- (IBAction)buttonPressed {
    ABPeoplePickerNavigationController* selectContactViewController = nil;

    selectContactViewController = [[ABPeoplePickerNavigationController alloc] init];
    selectContactViewController.peoplePickerDelegate = self;
    [self presentModalViewController:selectContactViewController animated:YES];
    [selectContactViewController release];
}  

简单的释放选择器如下:

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {

    [self dismissModalViewControllerAnimated:YES];
}

仪器标记“selectContactViewController = [[ABPeoplePickerNavigationController alloc] init];”作为泄漏。知道为什么吗?

【问题讨论】:

    标签: iphone memory-management memory-leaks


    【解决方案1】:

    您可能希望像这样构建您的 Picker 控件:

    ABPeoplePickerNavigationController* selectContactViewController = nil;
    
    selectContactViewController = [[[ABPeoplePickerNavigationController alloc] init] autorelease];
    selectContactViewController.peoplePickerDelegate = self;
    [self presentModalViewController:selectContactViewController animated:YES];
    

    当您呈现模态视图控制器时,它将自行保留视图。这就是它仍然能够将视图控制器的实例传递给您的委托的方式。最好的办法是将视图控制器设置为自动释放,因此当它从导航控制器中弹出时,NSAutoReleasePool 将垃圾收集它。

    【讨论】:

    • 引用计数不是垃圾回收。 iPhone OS 不进行垃圾回收。
    • 你是正确的 tc 但我还是尝试使用自动释放但没有奏效...我正在 3.1.3 上测试该操作系统版本是否可能存在泄漏?
    【解决方案2】:

    只是一个评论——你在接口声明中使用了 UINavigationControllerDelegate 之类的协议吗?

    我遇到了一种情况,仅引用此协议就会导致类似的泄漏消息。

    【讨论】:

    • 我正在使用 ABPeoplePickerNavigationControllerDelegate 协议,但即使只是为了验证它不会导致泄漏,我也看不出如何不包含它...
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2011-03-28
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多