我正在开发一个应用程序,因为我已将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?
答案 0 :(得分:1)
看起来像是内存管理问题:
lastIndexPath=indexPath
该行不会告诉indexPath挂起:)
你需要改为:
[lastIndexPath autorelease];
lastIndexPath = [indexPath retain];
首先它告诉任何先前的lastIndexPath您已完成它。然后它告诉indexPath不要被释放,因此内存不会被用于其他任何东西(在你的情况下,NSArray)。
答案 1 :(得分:0)
如何声明指针与指针所指向的对象类型几乎没有关系。 Objective-C是非常松散的类型,你可以将一个UIViewController地址分配给一个NSString指针,只要你对这个赋值进行模糊处理,这样编译器中非常弱的类型检查就不会抱怨。
因此,您可以将NSArray地址分配给NSIndexPath指针,在尝试使用该值之前不会发生任何事情。
另外,正如Aliaksandr建议的那样,如果你没有保留应该保留的东西,地址“后面”的对象可能会被释放,然后重新分配为完全不同的东西。 (此问题尤其取决于时序/方案,并且可能导致代码例如在仿真器上工作但在硬件上失败。)
昨天我遇到了一个非常类似的问题(其他人写的一些旧代码中的错误,神秘地开始失败)。我最终通过代码在多个位置对NSLog指针description
和retainCount
进行了检测,以检测它在什么情况下发生了变化以及原因。 (问题是在另一个类中未正确声明assign
的属性。)