由于未捕获的异常'NSInvalidArgumentException'终止应用程序?

时间:2014-03-17 17:57:05

标签: ios objective-c cocoa-touch

我无法弄清楚为什么一旦我尝试使用[mainArray addObject:]表达式,我的整个程序就会失败!如果我传递它的字符串它工作得很好,但是一旦我尝试传递它变量失败,任何帮助?

#import "AG_ViewController.h"
#import "AG_Storage.h"
#import "AG_AddItemViewController.h"

@interface AG_ViewController ()



@end

@implementation AG_ViewController

- (void)viewDidLoad {
    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.

    mainArray = [NSMutableArray array];


    AG_Storage *item1 = [[AG_Storage alloc] init];
    item1.itemName = @"Test";

    NSLog(@"Add item1");
    NSLog(@"%@",mainArray);

    AG_Storage *item2 = [[AG_Storage alloc] init];
    item2.itemName = @"Test2";


    NSLog(@"Add item2");
    [mainArray addObject:item1];
    NSLog(@"%@", mainArray);

     }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [mainArray count]; }


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

    UITableViewCell *cell = [tableViewer dequeueReusableCellWithIdentifier:@"thisCell"];
    cell.textLabel.text = [mainArray objectAtIndex:indexPath.row];
    return cell; }

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated. }

@end

我在头文件中初始化了mainArray,

@interface AG_ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>{

IBOutlet UITableView *tableView;

NSMutableArray *mainArray;

}

日志如下:

2014-03-18 13:49:26.028 AgendaBk[22575:a0b] Add item1
2014-03-18 13:49:26.030 AgendaBk[22575:a0b] (
)
2014-03-18 13:49:26.030 AgendaBk[22575:a0b] Add item2
2014-03-18 13:49:26.031 AgendaBk[22575:a0b] (
    "<AG_Storage: 0x895bdc0>"
)
2014-03-18 13:49:26.036 AgendaBk[22575:a0b] -[AG_Storage length]: unrecognized selector sent to instance 0x895bdc0
2014-03-18 13:49:26.039 AgendaBk[22575:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AG_Storage length]: unrecognized selector sent to instance 

垃圾在这里

libc++abi.dylib: terminating with uncaught exception of type NSException

3 个答案:

答案 0 :(得分:0)

注意(您可能实际上并没有在代码中使用它,但无论如何):别忘了NSMutableArray *mainArray = [NSMutableArray array]

尝试使用[mainArray addObjectsFromArray:@[item1, item2]];

答案 1 :(得分:0)

试试这种方式

 - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

       NSMutableArray *mainArray = [NSMutableArray array];

        AG_Storage *item1 = [[AG_Storage alloc] init];
        item1.itemName = @"Test";
        NSLog(@"Add item1");
        NSLog(@"%@",mainArray);

        AG_Storage *item2 = [[AG_Storage alloc] init];
        item2.itemName = @"Test2";
        NSLog(@"Add item2");
        [mainArray addObjectsFromArray:[NSArray arrayWithObjects: item1, item2, nil]];
        NSLog(@"%@",mainArray);


    }

由于

答案 2 :(得分:0)

我认为您不太了解实例变量和局部变量之间的区别。如果您的第一个代码版本已编译但您尚未更改属性,那么您的第一个示例将NSMutableArray *分配给实例变量,其中它保持不变,直到该视图被释放,而第二个示例将NSMutableArray *分配给局部变量,一旦方法返回,ARC将解除分配它。 item1和item2也会消失。

强烈建议使用下划线(如_mainArray)启动实例变量,以使其更加明显。

抱歉,只是注意到是其他人将实例变量更改为本地变量。