iphone TableView 滚动中止-无法识别的选择器
<p><p>我知道有很多关于同一件事的问题,但到目前为止,我还无法为我的问题应用任何解决方案。而且我还没有弄清楚如何使用 Instruments。</p>
<p>我正在学习一个 iPhone 应用程序的基本教程,只是想稍微调整一下(我是 Objective C 的新手)。我希望它从带有字典数组而不是字符串数组的 plist 中读取。该表最初正确显示数据。但是,每当我向上滚动表格(并离开屏幕)时,我都会收到无法识别的选择器异常。只需使用 NSStrings 填充员工就可以了。我搞不清楚了。 </p>
<p>ViewController 的相关部分:</p>
<pre><code>@interface RootViewController : UITableViewController {
NSMutableArray *employees_;
}
@property (nonatomic, retain) NSMutableArray *employees;
@end
</code></pre>
<p>和</p>
<pre><code>@implementation RootViewController
@synthesize employees=employees_;
- (void)viewDidLoad
{
;
NSString *path = [ pathForResource:@"Employees" ofType:@"plist"];
NSMutableArray *empArray = [ initWithContentsOfFile:path];
employees_ = ;
;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = ;
if (cell == nil) {
cell = [[ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = ;//this is where it errors
return cell;
}
- (void)dealloc
{
;
;
}
@end
</code></pre>
<p>和 plist:</p>
<pre><code>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
</code></pre>
<p>我收到的错误:</p>
<pre>2011-10-18 20:02:44.313 MyApp -: 无法识别的选择器发送到实例 0x689a050
2011-10-18 20:02:44.316 MyApp *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-:无法识别的选择器发送到实例 0x689a050”
*** 第一次抛出调用堆栈:
(
0 核心基础 0x00dc25a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x00f16313 objc_exception_throw + 44
2核心基础0x00dc40bb-+187
3 核心基础 0x00d33966 ___转发___ + 966
4 核心基础 0x00d33522 _CF_forwarding_prep_0 + 50
5 MyApp 0x00002a96- + 326
6 UIKit 0x00089b98- + 634
7 UIKit 0x0007f4cc- + 75
8 UIKit 0x000948cc- + 1561
9 UIKit 0x0008c90c - + 242
10 QuartzCore 0x016aca5a - + 181
11quartz 核心 0x016aeddc CALayerLayoutIfNeeded + 220
12quartz 核心 0x016540b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
13quartz 核心 0x01655294 _ZN2CA11Transaction6commitEv + 292
14quartz 核心 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)
</pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>有两个潜在的问题:</p>
<ol>
<li><p>您需要确保对 <code>employees_ = </code> 的调用实际上返回了一个 NSArray</p></li>
<li><p>一旦排除,并且假设您没有使用 ARC,您的 employees_ivar 就会在 TableView 有机会进行 self 配置之前被释放。试试</p>
<p><code>employees_ = [ retain];</code></p></li>
</ol>
<p>然后在你的 viewDidUnload 和 dealloc 方法中释放 employees_。</p>
<p>很难从堆栈中分辨出来,因为它确实说您的 ivar 是 NSCFString,但这可能只是因为它引用了无效/垃圾内存地址。不过,根据您的 plist 描述,可能是第 1 点的原因。</p></p>
<p style="font-size: 20px;">关于iphone TableView 滚动中止-无法识别的选择器,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/7815266/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/7815266/
</a>
</p>
页:
[1]