ios - 通过alloc方法初始化单例和普通对象有什么区别?

标签 ios

我正在测试 UITableView :(在 ARC 下) 代码如下,

- (void)viewDidLoad
{
    [super viewDidLoad];
    UnitTest *unitTest = [[UnitTest alloc] init];

    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    tableView.delegate = unitTest;
    tableView.dataSource = unitTest;

    [self.view addSubview:tableView];

}

我已经在对象单元测试中实现了 tableView 委托(delegate)。当我运行我的项目时,它出现错误:

libobjc.A.dylib`objc_msgSend:
0x30f13f68:  teq.w  r0, #0
0x30f13f6c:  beq    0x30f13faa               ; objc_msgSend + 66
0x30f13f6e:  push.w {r3, r4}
0x30f13f72:  ldr    r4, [r0]                // Thread 1: BAD_EXE_ACCESS ....
0x30f13f74:  lsr.w  r9, r1, #2
0x30f13f78:  ldr    r3, [r4, #8]
0x30f13f7a:  add.w  r3, r3, #8
0x30f13f7e:  ldr    r12, [r3, #-8]

控制台中没有任何内容。

当我改变线路时

UnitTest *unitTest = [[UnitTest alloc] init];

UnitTest *unitTest = [UnitTest sharedUnitTest]; // i have implement this singleton

一切正常!!为什么

最佳答案

您在 ARC,这在这里意味着一些事情。基本上,您的 unitTest 迟早会被释放,因为您不保留对它的任何引用。但它仍然是 tableView 的委托(delegate)和数据源。因此,一段时间后(为了简化),tableView 将尝试调用其委托(delegate),但 unitTest 将被释放。

因此,这里最简单的解决方案是为 unitTest 创建一个属性: @property (nonatomic, Strong) UnitTest *unitTest; 在你的头文件中,在你的 .m 中综合它

然后,只需使用:

self.unitTest = [[UnitTest alloc] init];

它应该可以解决所有问题。为此,您可能不需要单例。

PS:单例修复这个问题的原因是单例会“永远存在”(只要应用程序启动)。由于它永远不会被释放,因此当 TableView 尝试调用其委托(delegate)/数据源时不会出现问题。

关于ios - 通过alloc方法初始化单例和普通对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344000/

相关文章:

ios - 表格 View 压缩,标签偏离中心并且看不到按钮

ios - AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)

objective-c - 如何通过多个详细 View Controller 保留indexPath值?

ipad - 我们如何打印包含 uiimage 的 ipad View 和多行的 uitableview

ios - 在TestFlight中点击 "Submit for Review"后,status还是 "Ready to Submit"

objective-c - RestKit:连接不在响应中的关系

ios - Apple Watch 设置背景图片

ios - 在 iOS 中从无效 JSON 对象创建有效 JSON 对象

ios - 如何从 NSString 中提取数字?

iOS swift : Local persistence with CloudKit