我有一个像这样的tableview控制器,
NSString *selectedindex;
@interface ContactsController : UITableViewController<ABPeoplePickerNavigationControllerDelegate> {
NSMutableArray *names;
NSMutableArray *phonenumbers;
NSMutableArray *contacts;
DatabaseCRUD *sampledatabase;
}
+(NSString *) returnselectedindex;
@end
在我的实施文件中
+(NSString *) returnselectedindex
{
return selectedindex;
}
当在tableview中选择一行时,我输入以下代码。
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'
并崩溃。我不知道为什么。我以前用过很多次类方法,从来没有遇到过问题。请帮忙。谢谢。
答案 0 :(得分:1)
您崩溃的原因是您要为全局变量(selectedindex
)分配值,但您永远不会通过调用-retain
获取所有权。结果,字符串不知道你需要它留在身边,所以系统解除分配它。稍后,当您尝试访问它时,它已经被释放。
为了避免崩溃,您需要在分配值时添加保留调用。当然,由于选定的索引可能经常发生变化,因此您需要在覆盖之前释放之前的值并保留新值。因此,你应该有这个代码:
[selectedindex release];
selectedindex = [[NSString stringWithFormat:@"%d", indexPath.row] retain];
这将解决您的崩溃问题。
现在您的崩溃已经解决,但您应该重新考虑您的设计。 selectedindex
没有理由成为全局变量;由于所选索引很可能特定于ContactsController
的该实例,因此它应该是该类的实例变量。相反,您已将其声明为全局变量,这意味着selectedIndex
的所有实例之间只共享一个ContactsController
。然后,您的+returnselectedindex
方法应该是实例方法,而不是类方法。 (它也应该重命名,以便遵循Cocoa命名约定,但这不是主题。)
答案 1 :(得分:0)
我认为你没有分配selectedindex NSString。这就是为什么它不会在同一个类上崩溃并且它在新类中崩溃。 所以你在“ returnselectedindex ”的setter方法中分配它 否则,复制或保留 returnselectedindex 值的接收值,如下所示,
selected = [[ContactsController returnselectedindex]copy];