目标c中的类方法问题

时间:2011-02-11 07:14:33

标签: iphone objective-c

我有一个像这样的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'

并崩溃。我不知道为什么。我以前用过很多次类方法,从来没有遇到过问题。请帮忙。谢谢。

2 个答案:

答案 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];
相关问题