2011-02-11 82 views
0

我有一个的tableview控制器像这样的类方法,问题的目标C

NSString *selectedindex; 
@interface ContactsController : UITableViewController<ABPeoplePickerNavigationControllerDelegate> { 
    NSMutableArray *names; 
    NSMutableArray *phonenumbers; 
    NSMutableArray *contacts; 
    DatabaseCRUD *sampledatabase; 
} 

+(NSString *) returnselectedindex; 
@end 
在实现文件

我有

+(NSString *) returnselectedindex 
{ 
    return selectedindex; 
} 

当在tableview中选择了行i放有以下代码。

selectedindex = [NSString stringWithFormat:@"%d", indexPath.row]; 
NSLog(@"selected row is %@",selectedindex); 

在不同的类我试图访问selectedindex。像这样

selected = [ContactsController returnselectedindex]; 
NSLog(@"selected is %@",selected); 

它给了我一个警告:'ContactsController' may not respond to '+returnselectedindex'

和崩溃。我不知道为什么。我以前很多时候都使用过类方法,并且从来没有遇到过问题。请任何帮助。谢谢。

回答

1

你崩溃的原因是你将值赋给全局变量(selectedindex),但您永远不会通过调用-retain来获得它的所有权。结果,字符串不知道你需要它留在周围,所以系统将其释放。稍后,当您尝试访问它时,它已被释放。

为了避免崩溃,您需要在分配值时添加保留呼叫。当然,由于选定的索引可能会经常发生变化,因此您需要在覆盖并保留新索引之前释放之前的值。因此,你应该有这样的代码:

[selectedindex release]; 
selectedindex = [[NSString stringWithFormat:@"%d", indexPath.row] retain]; 

这将解决你的崩溃。

虽然现在你的崩溃已经修复,但你应该重新考虑你的设计。 selectedindex没有理由成为一个全局变量;由于所选索引很可能特定于您的ContactsController的实例,因此它应该是该类的实例变量。相反,您已将其声明为全局变量,这意味着在ContactsController的所有实例之间只有一个selectedIndex共享。然后,反过来,您的+returnselectedindex方法应该是一个实例方法,而不是一个类方法。 (它也应该重命名,以遵循可可命名约定,但这是很好的主题。)

+0

它修复了崩溃的问题,我得到了所需的输出,但我仍然有黄色的waringline它曾经崩溃。稍后我会看int0。 – Rajashekar 2011-02-11 07:53:37

0

我想你没有分配selectedindex NSString。这就是为什么它不会在同一个类上崩溃,并且它在新类中崩溃。 让你在的setter方法分配它“returnselectedindex” 否则,复制或保留returnselectedindex值这样的接收值,

selected = [[ContactsController returnselectedindex]copy]; 
+0

感谢您的意见,我会尽力而为。 – Rajashekar 2011-02-11 07:56:05