应用程序仍在运行时调用UITableViewDelegate dealloc方法

时间:2011-02-27 01:01:55

标签: ios uitableview exc-bad-access dealloc

我有一个处理表的委托方法的类。我已经使用了IB并将一个UITableViewDelegate拖入了NIB,我将其更改为了我的类。我还在NIB中包含了一个UITableView对象,我将delegate和dataSource连接到我的TableViewDelegate类。

我的类从Internet获取其表数据,因此我在视图设计中调用了一次调用的委托方法,并返回0,因为我的数据尚未到达。当我完成所有数据后,我做了[myTable reloadData],我的委托方法再次调用。 问题是我调用了numberOfRowsInSection,其中我现在返回行数,但从未得到调用的cellForRowAtIndexPath,而是获得EXC_BAD_ACCESS。 启用堆栈历史记录和Zombies后,我发现正在调用类的dealloc。

dealloc restTable类 - 在dealloc方法中使用NSLOG生成。

2011-02-27 00:33:59.979 PesquisaMapa [3526:207] * - [restTable tableView:cellForRowAtIndexPath:]:发送到解除分配的实例的消息0x5624190 由于我的对象最初是在IB中创建的,而我的IBOutlet是在主类头文件中声明的,并且只在应用程序完成时解除分配,我真的不明白为什么要解除分配该类的实例。 我的堆栈如下:

(gdb)info malloc-history 0x5624190 Alloc:块地址:0x05624190长度:160 Stack - pthread:0xa0a5f540帧数:34     malloc_zone_calloc中的0:0x9876f103     1:0x9在calloc中的0x9876f05a     2:_internal_class_createInstanceFromZone中的0x110ad0f     3:0x110d87d在class_createInstance中     4:0xedaff8 in + [NSObject(NSObject)allocWithZone:]     5:0xedadfa in + [NSObject(NSObject)alloc]     6:0x4c1205 in - [UIClassSwapper initWithCoder:]     7:UINibDecoderDecodeObjectForValue中的0x5a79e4     8:0x5a8693 in - [UINibDecoder decodeObjectForKey:]     9:0x4c0f43 in - [UIRuntimeConnection initWithCoder:]    10:UINibDecoderDecodeObjectForValue中的0x5a79e4    11:UINibDecoderDecodeObjectForValue中的0x5a72dc    12:0x5a8693 in - [UINibDecoder decodeObjectForKey:]    13:0x4c0200 in - [UINib instantiateWithOwner:options:]    14:0x4c2081 in - [NSBundle(UINSBundleAdditions)loadNibNamed:owner:options:]    15:0x37aa94 in - [UIViewController _loadViewFromNibNamed:bundle:]    16:0x378709 in - [UIViewController loadView]    17:0x3785e3 in - [UIViewController视图]    18:0x22fe in - [PesquisaMapaAppDelegate application:didFinishLaunchingWithOptions:] at /Users/pcasqueiro/Documents/PesquisaMapa/Classes/PesquisaMapaAppDelegate.m:24    19:0x2cb1fa in - [UIApplication _callInitializationDelegatesForURL:payload:suspended:]    20:0x2cd55e in - [UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]    21:0x2d7db2 in - [UIApplication handleEvent:withNewEvent:]    22:0x2d0202 in - [UIApplication sendEvent:]    23:0x2d5732在_UIApplicationHandleEvent中    24:0x18eca36在PurpleEventCallback中    25:0xf98064在 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION 中    26:_efCunLoopDoSource1中的0xef86f7    27:_efCunLoopRun中的0xef5983    28:CFefunLoopRunSpecific中的0xef5240    29:CFefunLoopRunInMode中的0xef5161    30:0x2ccfa8 in - [UIApplication _run]    31:U2pplicationMain中的0x2d942e    32:0x228c in main atUsers/pcasqueiro/Documents/PesquisaMapa/main.m:14    33:开始时的0x221d

看起来我的主类的didFinishLaunchingWithOptions正在进行一些清理。

关于我做错的任何想法?

感谢, PC

1 个答案:

答案 0 :(得分:0)

UITableView(以及大多数其他类)不保留其委托。这意味着如果你没有以某种方式保留委托(例如通过将其分配给声明为retain的属性),那么它将在某个时候被主运行循环处理掉。