• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iphone TableView 滚动中止-无法识别的选择器

[复制链接]
菜鸟教程小白 发表于 2022-12-13 09:28:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我知道有很多关于同一件事的问题,但到目前为止,我还无法为我的问题应用任何解决方案。而且我还没有弄清楚如何使用 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 *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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  quartz 核心 0x016aeddc CALayerLayoutIfNeeded + 220
    12  quartz 核心 0x016540b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
    13  quartz 核心 0x01655294 _ZN2CA11Transaction6commitEv + 292
    14  quartz 核心 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)



Best Answer-推荐答案


有两个潜在的问题:

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

  2. 一旦排除,并且假设您没有使用 ARC,您的 employees_ivar 就会在 TableView 有机会进行 self 配置之前被释放。试试

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

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

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

关于iphone TableView 滚动中止-无法识别的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7815266/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap