1

这快把我逼疯了!

我已经尝试完全像演示应用程序那样使用表格视图来实现警报视图。但是,在我的崩溃中: * -[SBTableAlert tableView:cellForRowAtIndexPath:]: message sent to deallocated instance 0x1e0aa800

我知道为什么这样做,我似乎无法追踪或修复它。同样莫名其妙的为什么我的版本在演示应用程序版本时不起作用。除非我遗漏了一些明显的东西。

我的实现:

 SBTableAlert *alert = [[SBTableAlert alloc] initWithTitle:NSLocalizedString(@"contact_deleted_title", NULL) cancelButtonTitle:NSLocalizedString(@"contact_deleted_cancel_button_title", NULL) messageFormat:NSLocalizedString(@"contact_deleted_message", NULL)];
    [alert setType:SBTableAlertTypeMultipleSelct];
    [alert.view addButtonWithTitle:NSLocalizedString(@"contact_deleted_other_button_title", NULL)];
    [alert.view setTag:0];
    [alert setDataSource:self];
    [alert setDelegate:self];
    [alert show];

出于调试的目的,我的委托方法实现是直接从示例应用程序复制和粘贴的,并且 SBTableAlert.h/m 未触及。

帮助!

4

2 回答 2

1

我有这个问题;下面概述的解决方案修复了它:

第 1 步:添加SBTableAlert.hSBTableAlert.m到您的项目。此类使用 MRC。

步骤2:因此,TellARC排除整个类文件(.m),转到Target Build Phases 并在其中Compiler Sources添加-fno-objc-arc标志,如下图所示:http: //www.invasivecode.com/blogimages/Xcode/ARC -Fig1.png

3 步:message sent to deallocated instance 0x1e0aa800发生错误是因为在警报显示之前SBTableAlert *alert已解除分配。ARC

以确保它在您需要时仍然存在。使它成为一个强大的属性,即

//
//  YourViewController.h
//

#import <UIKit/UIKit.h>
#import "SBTableAlert.h"

@interface YourViewController : UITableViewController <SBTableAlertDelegate,     SBTableAlertDataSource>{

@property (strong, nonatomic) SBTableAlert *strongAlert;

}

@end

//
//  YourViewController.m
//

@implementation YourViewController
@synthesize strongAlert;

然后您的上述代码(尝试显示警报)变为

strongAlert = [[SBTableAlert alloc] initWithTitle:NSLocalizedString(@"contact_deleted_title", NULL) cancelButtonTitle:NSLocalizedString(@"contact_deleted_cancel_button_title", NULL) messageFormat:NSLocalizedString(@"contact_deleted_message", NULL)];
[strongAlert setType:SBTableAlertTypeMultipleSelct];
[strongAlert.view addButtonWithTitle:NSLocalizedString(@"contact_deleted_other_button_title", NULL)];
[strongAlert.view setTag:0];
[strongAlert setDataSource:self];
[strongAlert setDelegate:self];
[strongAlert show];

希望这可以帮助

于 2013-07-29T10:04:36.153 回答
0

你错过了[alert autorelease];

如果您不使用 ARC,则上面的代码将不起作用。但是,您不应该使用 ARC,因此由于缺少参考,必须使用 release/autorelease/dealloc。

于 2013-02-01T04:11:59.157 回答