- [__ NSArrayI objectForKeyedSubscript:]:无法识别的选择器发送到实例IN xcode6 objective-c ios

时间:2015-04-13 06:24:34

标签: ios objective-c iphone xcode viewcontroller

我正在尝试学习objective-c,并遇到了一些我无法解决的崩溃。 我相信这是基本问题之一,但我是新来的,在中间迷路了。

我有:

  • ModelViewController.h
  • ModelViewController.m
  • Schedule.h
  • Schedule.m
ModelViewController.h中的

#import <UIKit/UIKit.h>

@interface FetchScheduleVC : UIViewController 
    @property (copy, nonatomic) NSMutableArray *myMutableArray;
@end
ModelViewController.m中的

#import "ModelViewController.h"
#import "Schedule.h"

@implementation Model
- (void)viewDidLoad {
    [super viewDidLoad];
    for(int i=0; i < 3; i++){
        [_myMutableArray addObjects: [NSNumber numberWithInt: i]
    }
}
- (IBAction)saveBtn:(UIButton *)sender {
     Schedule *newSchedule = [[Schedule alloc]init];
    [newSchedule createClassFromArray: _myMutableArray];
}
@end
在Schedule.h中

#import <Foundation/Foundation.h>

@interface Schedule : NSObject
@property (strong, nonatomic) NSMutableArray *classArray;
-(void) createClassFromArray: (NSArray *) selectedArr;
@end
在Schedule.m中

#import "Schedule.h"

@implementation Schedule
-(void) createClassFromArray: (NSArray *) selectedArr {
    for(NSNumber *i in selectedArr){
    NSLog(@"number in array is : %@", i);
    }
}
@end

我简化了我的代码,但基本流程是相同的。 当我运行它,然后单击一个按钮来调用 - (IBAction)saveBtn:(UIButton *)发送者时,我得到:

-[__NSArrayI objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7fcb61d2fd10
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7fcb61d2fd10'

在这里通过Method发送NSArray有什么不妥的行为吗?

3 个答案:

答案 0 :(得分:4)

我只能告诉您代码中发生了什么,而不是发生在哪里,因为您还没有发布违规代码。

objectForKeyedSubscript下标调用NSDictionary方法,例如:

NSDictionary *dict = @{ @"key" : @"value" };
NSString *value = dict[@"key"];    // HERE

所以看起来你正在做这样的事情:

for(int i=0; i < 3; i++){
    [_myMutableArray addObjects: [NSNumber numberWithInt: i]
}
NSNumber *num = _myMutableArray[@"3"];    // !!!!

我可以告诉你的另一件事是,它与未初始化的数组没有关系,因为Objective-C只是忽略了取消引用nil个对象的尝试,而且这种异常远不止这些。

答案 1 :(得分:0)

正如您已将myMutableArray声明为复制语义为 -

@property (copy, nonatomic) NSMutableArray *myMutableArray;

这将向数组发送一条复制消息,从而产生一个不可变的副本。

因此,要在NSMutableArray上使用上述语义,您需要将“setter”方法覆盖为 -

- (void)setArray:(NSArray *)newArray 
{
    if ( array != newArray ) 
{ 
        [array release];
        array = [newArray mutableCopy];
    }
}

上面的setter方法只是将newArray的可变副本的引用赋给数组,这可以帮助你改变对象,从而避免错误。

答案 2 :(得分:0)

在上面的代码中,我忘了包含

_myMutableArray = [[NSMutableArray alloc] init];

虽然我的实际代码中有这个。

问题非常愚蠢。对不起这个误导性的问题。希望你忽略这个问题,因为这是一个粗心的错误。

在我的实际代码中,我有像这样的重复变量名:

在Schedule.h中

#import <Foundation/Foundation.h>

@interface Schedule : NSObject
@property (strong, nonatomic) NSMutableArray *selectedArr;
-(void) createClassFromArray: (NSArray *) selectedArr;
@end

..非常......粗心的错误。