我正在尝试学习objective-c,并遇到了一些我无法解决的崩溃。 我相信这是基本问题之一,但我是新来的,在中间迷路了。
我有:
#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有什么不妥的行为吗?
答案 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
..非常......粗心的错误。