UITableViewDelegate dealloc 方法在应用程序仍在运行时被调用
Posted
技术标签:
【中文标题】UITableViewDelegate dealloc 方法在应用程序仍在运行时被调用【英文标题】:UITableViewDelegate dealloc method being call while application is still running 【发布时间】:2011-02-27 01:01:55 【问题描述】:我有一个处理表的委托方法的类。我已经使用了 IB 并将一个 UITableViewDelegate 拖到了 NIB 中,该 UITableViewDelegate 已更改为我的班级。我还在 NIB 中包含了一个 UITableView 对象,我在其中将委托和数据源连接到我的 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 堆栈 - pthread:0xa0a5f540 帧数:34 0: malloc_zone_calloc 中的 0x9876f103 1: 0x9876f05a 在 calloc 2: _internal_class_createInstanceFromZone 中的 0x110ad0f 3:class_createInstance 中的 0x110d87d 4: 0xedaff8 在 +[NSObject(NSObject) allocWithZone:] 5: +[NSObject(NSObject) alloc] 中的 0xedadfa 6: 0x4c1205 在 -[UIClassSwapper initWithCoder:] 7: UINibDecoderDecodeObjectForValue 中的 0x5a79e4 8: 0x5a8693 在 -[UINibDecoder decodeObjectForKey:] 9: 0x4c0f43 在 -[UIRuntimeConnection initWithCoder:] 10:UINibDecoderDecodeObjectForValue 中的 0x5a79e4 11: UINibDecoderDecodeObjectForValue 中的 0x5a72dc 12: 0x5a8693 在 -[UINibDecoder decodeObjectForKey:] 13: 0x4c0200 在 -[UINib instantiateWithOwner:options:] 14: 0x4c2081 在 -[NSBundle(UISBundleAdditions) loadNibNamed:owner:options:] 15: 0x37aa94 在 -[UIViewController _loadViewFromNibNamed:bundle:] 16: 0x378709 在 -[UIViewController loadView] 17: 0x3785e3 在 -[UIViewController 视图] 18:0x22fe 在 -[PesquisaMapaAppDelegate 应用程序:didFinishLaunchingWithOptions:] 在 /Users/pcasqueiro/Documents/PesquisaMapa/Classes/PesquisaMapaAppDelegate.m:24 19:0x2cb1fa 在 -[UIApplication_callInitializationDelegatesForURL:payload:suspended:] 20: 0x2cd55e 在 -[UIApplication_runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] 21: 0x2d7db2 在 -[UIApplication handleEvent:withNewEvent:] 22: 0x2d0202 在 -[UIApplication sendEvent:] 23: _UIApplicationHandleEvent 中的 0x2d5732 24: PurpleEventCallback 中的 0x18eca36 25:CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION 中的 0xf98064 26: __CFRunLoopDoSource1 中的 0xef86f7 27: __CFRunLoopRun 中的 0xef5983 28: CFRunLoopRunSpecific 中的 0xef5240 29: CFRunLoopRunInMode 中的 0xef5161 30: 0x2ccfa8 在 -[UIApplication_run] 31: UIApplicationMain 中的 0x2d942e 32: 0x228c 在 /Users/pcasqueiro/Documents/PesquisaMapa/main.m:14 33: 0x221d 开始
我的主类的 didFinishLaunchingWithOptions 中似乎正在进行一些清理工作。
对我做错了什么有任何想法吗?
谢谢, 电脑
【问题讨论】:
【参考方案1】:UITableView(和大多数其他类)不保留它们的委托。这意味着,如果您不以某种方式保留委托(例如,通过将其分配给声明为保留的属性),那么它将在某个时候被主运行循环处理掉。
【讨论】:
以上是关于UITableViewDelegate dealloc 方法在应用程序仍在运行时被调用的主要内容,如果未能解决你的问题,请参考以下文章
分离 UITableViewDelegate 和 UITableViewDataSource 导致没有数据显示
UIViewController 和 UITableViewDelegate 之间的通信
在 UITableViewDelegate 方法 heightForRowAtIndexPath 中获取表格视图单元格属性:
广义的 UITableViewDelegate 和 UITableViewDataSource
如何从 UITableViewDelegate 的 didSelectRowtAtIndexPath 方法显示 UINavigationController?