NSIndexPath对象显示为NSArray对象?

时间:2011-11-22 11:51:29

标签: iphone nsarray nsindexpath

我正在开发一个应用程序,因为我已将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?

2 个答案:

答案 0 :(得分:1)

看起来像是内存管理问题:

lastIndexPath=indexPath

该行不会告诉indexPath挂起:)

你需要改为:

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

首先它告诉任何先前的lastIndexPath您已完成它。然后它告诉indexPath不要被释放,因此内存不会被用于其他任何东西(在你的情况下,NSArray)。

答案 1 :(得分:0)

如何声明指针与指针所指向的对象类型几乎没有关系。 Objective-C是非常松散的类型,你可以将一个UIViewController地址分配给一个NSString指针,只要你对这个赋值进行模糊处理,这样编译器中非常弱的类型检查就不会抱怨。

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

另外,正如Aliaksandr建议的那样,如果你没有保留应该保留的东西,地址“后面”的对象可能会被释放,然后重新分配为完全不同的东西。 (此问题尤其取决于时序/方案,并且可能导致代码例如在仿真器上工作但在硬件上失败。)

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