1

我正在开发一个应用程序,其中我已将 iVar 声明为 NSIndexPath 对象,但它在 didSelectRowAtIndexPath 中显示为 NSArray 对象。它是如何显示的,我这边的错误是什么。请帮我。提前致谢。

示例代码:

//.h file:
NSIndexPath *lastIndexPath;

//.m file:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

      if([[default1 objectForKey:@"keyToRepeatString"] isEqualToString:[arrayRepeat   objectAtIndex:i]])
        {
            lastIndexPath=indexPath;
            repeatString=[default1 objectForKey:@"keyToRepeatString"];
        }
}

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
int newRow = [indexPath row];
    int oldRow = [lastIndexPath row];
 }

    int oldRow = [lastIndexPath row];........//Here lastIndexPath shows as NSArray obj?
4

2 回答 2

1

看起来像一个内存管理问题:

lastIndexPath=indexPath

那条线并没有告诉 indexPath 闲逛:)

你需要把它改为:

[lastIndexPath autorelease];
lastIndexPath = [indexPath retain];

首先它告诉任何以前的 lastIndexPath 你已经完成了它。然后它告诉 indexPath 不要被释放,这样内存就不会被用于其他任何事情(在你的情况下,是一个 NSArray)。

于 2011-11-22T12:33:49.383 回答
0

如何声明指针与指针所针对的对象类型几乎没有关系。Objective-C 的类型非常松散,您可以将例如 UIViewController 地址分配给 NSString 指针,只要您混淆分配以便编译器中非常弱的类型检查不会抱怨。

因此,您可以将 NSArray 地址分配给 NSIndexPath 指针,并且在您尝试使用该值之前不会发生任何事情。

此外,正如 Aliaksandr 所建议的,如果您未能保留应保留的内容,则地址“后面”的对象可能会被释放,然后作为完全不同的东西重新分配。(这个问题特别依赖于时间/场景,可能会导致代码在模拟器上运行但在硬件上失败。)

昨天我遇到了一个非常相似的问题(由其他人编写的一些旧代码中的错误神秘地开始失败)。我最终不得不通过代码对指针descriptionretainCount多个位置进行 NSLog 记录,以检测它在什么情况下发生了变化以及原因。assign(问题是在另一个类中不正确地声明了一个属性。)

于 2011-11-22T12:29:51.680 回答