NsMutableArray 无故更改为 UITableViewCellContentView

Posted

技术标签:

【中文标题】NsMutableArray 无故更改为 UITableViewCellContentView【英文标题】:NsMutableArray changes to UITableViewCellContentView for no reason 【发布时间】:2010-11-13 01:05:38 【问题描述】:

我有一个 bissare 问题。在 UITableViewController 的 viewDidLoad 方法中,我有:

myfields = [NSMutableArray array];
    for (int x = 0; x < 10; x++) 
        UITextField * field = [[UITextField alloc] initWithFrame:CGRectMake(130,12,150,25)];
        field.backgroundColor = [UIColor clearColor];
        field.font = [UIFont systemFontOfSize:15];
        field.delegate = [[OptionFieldDelegate alloc] init];
        [myfields addObject: field];
    
    NSLog(@"myfields array - %@",myfields);

这给出了这个输出:

myfields array - (
    "<UITextField: 0x6a35b50; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a35c60>>",
    "<UITextField: 0x6a36820; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a367f0>>",
    "<UITextField: 0x6a374e0; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a374b0>>",
    "<UITextField: 0x6a382e0; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a382b0>>",
    "<UITextField: 0x6a38ea0; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a38e70>>",
    "<UITextField: 0x6a39950; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a39a60>>",
    "<UITextField: 0x6a3a630; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a3a600>>",
    "<UITextField: 0x6a3b1f0; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a3b1c0>>",
    "<UITextField: 0x6a3bdb0; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a3bd80>>",
    "<UITextField: 0x6a3c970; frame = (130 12; 150 25); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x6a3c880>>"
)

这很好,但下一点不是。在需要之前我不会触摸该数组,但在 - tableView:cellForRowAtIndexPath: 方法中我有这个:

NSLog(@"Array = %@",myfields);
                    NSLog(@"class - %@",NSStringFromClass([myfields class]));
                    NSLog(@"0 - %i",[indexPath row] - 2);
                    NSLog(@"1 - %@",[myfields objectAtIndex:[indexPath row] - 2]);
                    [[cell contentView] addSubview: [myfields objectAtIndex:[indexPath row] - 2]];

这是输出:

2010-11-13 00:58:13.808 Poll Maker[1803:207] Array = <UITableViewCellContentView: 0x6a35b10; frame = (10 1; 300 43); layer = <CALayer: 0x6a3e680>>
2010-11-13 00:58:13.809 Poll Maker[1803:207] class - UITableViewCellContentView
2010-11-13 00:58:13.809 Poll Maker[1803:207] 0 - 0
2010-11-13 00:58:13.810 Poll Maker[1803:207] -[UITableViewCellContentView objectAtIndex:]: unrecognized selector sent to instance 0x6a35b10
2010-11-13 00:58:13.812 Poll Maker[1803:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCellContentView objectAtIndex:]: unrecognized selector sent to instance 0x6a35b10'

我很困惑。谁能帮我?谢谢。

【问题讨论】:

【参考方案1】:

您犯了一个内存管理错误。如果您希望数组在第一个方法结束后保留​​,则必须保留该数组。

在您的情况下,数组曾经所在的内存(在自动释放池释放之前)被 UITableViewCell 的子视图覆盖。

【讨论】:

非常感谢。我应该知道的。【参考方案2】:

Ole Begemann 可能已经找到了问题的原因,但是当您遇到内存管理问题(选择器被发送到错误的实例是内存管理问题的迹象)时,您可以采取多种措施:

    重新阅读 Cocoa memory management rules 并确保您关注它们。 运行static analyser。这通常会发现您忽略了内存管理规则的地方。 尝试使用NSZombieEnabled 了解您是否[以及何时]向未分配的实例发送消息。

【讨论】:

感谢您的建议。我在 Objective-C 上越来越好......慢慢地。

以上是关于NsMutableArray 无故更改为 UITableViewCellContentView的主要内容,如果未能解决你的问题,请参考以下文章

从 NSMutableArray 更改为 .plist

无法将 NSMutableArray 类型的值分配给 UIBarButtonItem 类型

操场上的 NSMutableArray 导致 Xcode 7 出现错误

点击时表格视图单元格分隔线消失

elasticsearch无故关闭,Log无报错

无效更新:第 0 节 UITableView 中的行数无效