由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFString objectForKey:]:无法识别的选择器已发送到实例
Posted
技术标签:
【中文标题】由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFString objectForKey:]:无法识别的选择器已发送到实例【英文标题】:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectForKey:]: unrecognized selector sent to instance 【发布时间】:2012-08-25 06:21:35 【问题描述】:我在主header file
中有以下代码
NSMutableArray *array;
NSDictionary *dict,*dict1;
.m
文件包含显示商品名称及其相应价格的字典数组,我已在 UITableView
中显示此内容
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
return [array count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.textLabel.text=[NSString stringWithFormat:@"%@ %@",[[array objectAtIndex:indexPath.row]objectForKey:@"name"],[[array objectAtIndex:indexPath.row]objectForKey:@"price"]];
return cell;
当用户选择任何一个项目时,它会将dictionary
另一个称为传递的dictionary
发送到VegQuantityViewController
,其中数量必须乘以价格
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if(indexPath.row==0)
VegQuantity *vegetarian1 = [[VegQuantity alloc] initWithNibName:@"VegQuantity" bundle:nil];
vegetarian1.pass=dict;
[self presentModalViewController:vegetarian1 animated:YES];
if(indexPath.row==1)
VegQuantity *vegetarian1 = [[VegQuantity alloc] initWithNibName:@"VegQuantity" bundle:nil];
vegetarian1.pass=dict1;
[self presentModalViewController:vegetarian1 animated:YES];
- (void)viewDidLoad
array=[NSMutableArray array];
dict=[NSDictionary dictionaryWithObjectsAndKeys:@"20.00",@"price",@"tomato soup",@"name",nil];
[array addObject:dict];
dict1=[NSDictionary dictionaryWithObjectsAndKeys:@"10.00",@"price",@"Veg Manchow soup",@"name",nil];
[array addObject:dict1];
NSLog(@"The array of dictionaries contains%@",array);
[super viewDidLoad];
VegQuantity.h
NSDictionary *pass;
IBOutlet UIButton *done;
IBOutlet UITextField *input,*output;
NSNumber *prices;
float x,y,c;
VegQuantity.m
done
按钮仅检索该特定菜肴的密钥,并将其与用户在 textfield
中输入的数量相乘,并将其显示在输出 textfield
我在通过objectForKey
线时面临NSInvalidArgumentException
,可能是什么问题?
-(IBAction)done:(id)sender
prices=[pass objectForKey:@"price"];
x=[input.text floatValue];
y=[prices floatValue];
c=x*y;
output.text=[NSString stringWithFormat:@"%f",c];
【问题讨论】:
如果您将代码更改为 ARC,这将解决大多数此类问题。 【参考方案1】:在 viewDidLoad 方法中更改以下代码。
array=[[NSMutableArray alloc]init];
dict=[[NSDictionary alloc] initWithObjectsAndKeys:@"20.00",@"price",@"tomato soup",@"name",nil];
[array addObject:dict];
dict1=[[NSDictionary alloc]initWithObjectsAndKeys:@"10.00",@"price",@"Veg Manchow soup",@"name",nil];
[array addObject:dict1];
【讨论】:
【参考方案2】:在您的案例数组中, dict 和 dict1 是 autoreleased
对象。在viewDidLoad
方法中保留这些成员变量。或者对这些变量具有保留属性。它正在崩溃,因为 dict 正在被释放。崩溃表明变量 dict 的类型为CFString
,这可能是由于该对象的autoreleasing
引起的。
【讨论】:
以上是关于由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFString objectForKey:]:无法识别的选择器已发送到实例的主要内容,如果未能解决你的问题,请参考以下文章
由于未捕获的异常而终止应用程序 [UIImageView _isResizable]
由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序