iphone表视图滚动中止-无法识别的选择器

Posted

技术标签:

【中文标题】iphone表视图滚动中止-无法识别的选择器【英文标题】:iphone table view scroll aborts - unrecognized selector 【发布时间】:2011-10-19 00:21:39 【问题描述】:

我知道有很多关于同一件事的问题,但到目前为止,我还无法为我的问题应用任何解决方案。而且我还没有弄清楚如何使用 Instruments。

我正在学习一个 iPhone 应用程序的基本教程,只是想稍微调整一下(我是 Objective C 的新手)。我希望它从带有字典数组而不是字符串数组的 plist 中读取。该表最初正确显示数据。但是,每当我向上滚动表格(并离开屏幕)时,我都会收到无法识别的选择器异常。只需使用 NSStrings 填充员工就可以了。我搞不清楚了。

ViewController 的相关部分:

@interface RootViewController : UITableViewController 

NSMutableArray *employees_;


@property (nonatomic, retain) NSMutableArray *employees;
@end

@implementation RootViewController

@synthesize employees=employees_;


- (void)viewDidLoad

 [super viewDidLoad];

 NSString *path = [[NSBundle mainBundle] pathForResource:@"Employees" ofType:@"plist"];

 NSMutableArray *empArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

 employees_ = [empArray valueForKey:@"name"];
 [empArray release];



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


// Configure the cell.

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = [self.employees objectAtIndex:indexPath.row];//this is where it errors

return cell;

- (void)dealloc

 [employees_ release];
 [super dealloc];


@end

和 plist:

array
      dict
        key name /key
        string Employee One /string
        key id /key
        string T1234 /string 
      /dict
      dict
        key name /key
        string Employee Two /string
        key id /key
        string T5678 /string 
     /dict
/array

我收到的错误:

2011-10-18 20:02:44.313 MyApp[65148:bc03]-[NSCFString objectAtIndex:]:无法识别的选择器发送到实例 0x689a050 2011-10-18 20:02:44.316 MyApp[65148:bc03] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFString objectAtIndex:]:无法识别的选择器发送到实例 0x689a050” *** 第一次抛出调用堆栈: ( 0 核心基础 0x00dc25a9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x00f16313 objc_exception_throw + 44 2核心基础0x00dc40bb-[NSObject(NSObject)不识别选择器:]+187 3 核心基础 0x00d33966 ___转发___ + 966 4 核心基础 0x00d33522 _CF_forwarding_prep_0 + 50 5 MyApp 0x00002a96-[RootViewController tableView:cellForRowAtIndexPath:] + 326 6 UIKit 0x00089b98-[UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:withIndexPath:] + 634 7 UIKit 0x0007f4cc-[UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:] + 75 8 UIKit 0x000948cc-[UITableView(_UITableViewPrivate)_updateVisibleCellsNow:] + 1561 9 UIKit 0x0008c90c -[UITableView layoutSubviews] + 242 10 QuartzCore 0x016aca5a -[CALayer layoutSublayers] + 181 11 石英核心 0x016aeddc CALayerLayoutIfNeeded + 220 12 石英核心 0x016540b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 13 石英核心 0x01655294 _ZN2CA11Transaction6commitEv + 292 14 石英核心 0x0165546d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 15 核心基础 0x00da389b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 16 核心基础 0x00d386e7 __CFRunLoopDoObservers + 295 17 核心基础 0x00d011d7 __CFRunLoopRun + 1575 18 核心基础 0x00d00840 CFRunLoopRunSpecific + 208 19 核心基础 0x00d00761 CFRunLoopRunInMode + 97 20 图形服务 0x00ffa1c4 GSEventRunModal + 217 21 图形服务 0x00ffa289 GSEventRun + 115 22 UIKit 0x00022c93 UIApplicationMain + 1160 23 我的应用程序 0x00002249 主要 + 121 24 我的应用程序 0x000021c5 开始 + 53 ) 终止调用抛出异常当前语言:自动;目前客观-c (gdb)

【问题讨论】:

【参考方案1】:

有两个潜在的问题:

    您需要确保对employees_ = [empArray valueForKey:@"name"] 的调用实际上返回的是一个NSArray

    一旦排除,并且假设您没有使用 ARC,您的 employees_ ivar 就会在表视图有机会进行自我配置之前被释放。试试

    employees_ = [[empArray valueForKey:@"name"] retain];

然后在你的 viewDidUnload 和 dealloc 方法中释放 employees_。

很难从堆栈中分辨出来,因为它确实说您的 ivar 是 NSCFString,但这可能只是因为它引用了无效/垃圾内存地址。不过,根据您的 plist 描述,可能是第 1 点的原因。

【讨论】:

谢谢 - 我明天会调查这两个。我只是想补充一点,应用程序第一次加载时表格确实显示正确;只有当我将表格从屏幕上滚动出来时才会出错。所以我假设我的 plist 解析最初是正确的。【参考方案2】:

-[NSCFString objectAtIndex:]: unrecognized selector

这意味着您尝试在 NSCFString 类的实例(与 NSString 相同)上发送选择器(即调用方法)objectAtIndex:。 (“下一步/核心基础字符串”)

你不能这样做。

由于您只在上述代码的一处调用 objectAtIndex:,因此很容易看出问题出在哪里。 (除了在你的调试器中你应该能够看到它发生在哪一行。)你打电话给[self.employees objectAtIndex:...]。显然,您希望 self.employees 是一个数组,但它是一个字符串。我真的不知道 plist 处理,所以弄清楚为什么员工得到一个字符串以及如何让它得到一个数组取决于你。

【讨论】:

谢谢。我刚刚编辑说表格最初显示正确。所以我想我最初正确地解析了 plist。只有当我滚动时它才会出错。明天我会再深入研究一下。

以上是关于iphone表视图滚动中止-无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:“无法识别的选择器发送到实例”

iPhone:“无法识别的选择器已发送到实例”错误

自定义表视图控制器因“initWithCoder:无法识别的选择器发送到实例”而崩溃

iPhone - 无法识别的选择器,“可能无法响应 addTarget”

iphone os 5 - 无法识别的选择器发送到实例

在 Instruments 中运行的 iPhone 应用程序因无法识别的选择器而失败