“ - [NSArray的数]只为抽象类定义为”使用一个NSArray子类

问题描述:

我有一个NSArray子拿着,我要排序的对象时例外,但我得到一个异常与消息“ - [NSArray的数]只为抽象类定义为”使用一个NSArray子类

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSArray count]:仅为抽象类定义的方法。定义 - [CharacterArray count]!'

我已经尝试了下面的两种方式来做到这一点,但两次都得到了上述错误。

[characters sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"strength" ascending:YES]]]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"strength" ascending:YES]; 
[characters sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

我尝试了一些其他的方式来做到这一点,如下所示;

NSSortDescriptor *characterSort = [NSSortDescriptor sortDescriptorWithKey:@"strength" ascending:YES selector:@selector(compare:)]; 

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"strength" ascending:YES]; 
NSMutableArray *arr = [[characters sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy]; 

NSSortDescriptor *valueDescriptor = [[NSSortDescriptor alloc] initWithKey:@"strength" ascending:YES]; 
NSArray *descriptors = [NSArray arrayWithObject:valueDescriptor]; 
NSArray *sortedArray = [characters sortedArrayUsingDescriptors:descriptors]; 

但与这些方法我得到未使用的变量警告,没有得到排序在我原来的数组时,我调用该方法。

#import <Foundation/Foundation.h> 
#import "character_array.h" 
@implementation CharacterArray 
- (instancetype) init 
{ 
self = [super init]; 
if (self) 
    self.characters = [NSMutableArray array]; return self; 
} 
- (void) addCharacter: (Character *) charact 
{ NSLog(@"add character method entered"); 
[self.characters addObject: charact]; 
} 
- (void) printAll 
{ 
int num = 1; 
NSLog(@"print all method entered"); 
for (Character *theCharacter in self.characters) 
{ NSLog (@"%d : ", num++); 
    [theCharacter printDetails]; 
} 
} 
@end 

#import <Foundation/Foundation.h> 
#import "game_character.h" 
@interface CharacterArray : NSMutableArray 
@property (strong) NSMutableArray *characters; 
- (void) addCharacter: (Character *) charact; 
- (void) printAll; 
@end 

下进口一切

CharacterArray *characters; 

在main方法

characters = [CharacterArray alloc]; 
characters = [characters init]; 
+1

错误消息表明您已尝试子类'NSArray',尽管这可能不是经常需要或推荐的。您应该将类​​'CharacterArray'的详细信息以及哪些类型的变量添加到您的问题中,以便帮助人们帮助您。 – CRD

+0

@CRD我添加了CharacterArray类和标题。我必须为我的任务使用这种类型的数组类。 – Lee

+2

为什么'CharactersArray'继承自'NSMutableArray',而你似乎使用的似乎接近'NSMutableArray'的属性是你的属性'characters'?确实有道理。你需要定义' - (NSInteger)count'方法,它可以返回'self.characters.count',但是再一次,从NSMutableArray继承似乎毫无意义。 – Larme

你确定你需要创建一个CharacterArray类和,它应该是一个子类NS(Mutable)Array。检查意图不是你应该使用NS(Mutable)Array实例characterArray,这似乎很可能在“第一个Objective-C任务”中;或者您打算编写您的课程而不是继承自NS(Mutable)Array,但不太可能但可能。

最不可能的是,你的意思是要了解NS(Mutable)Array不能被细分为小类。注意你的错误包括:

...只为抽象类定义...

Objective-C中确实没有“抽象”类,但系统的框架也使用的设计被称为类集群,它可以表现出一些相同的行为,这就是错误信息试图指出的内容。对于类集群,简单继承无法按预期工作,因为在这种情况下公共类NS(Mutable)Array实际上并未实现其许多方法的行为,但依赖于集群中的其他类来执行此操作 - 而这些实现不是由公共类的子类继承。

听起来很复杂吗?这就是为什么它在“第一项任务”中出人意料的原因。

不过也不是很难真正继承NS(Mutable)Array只要你遵守规则,这是实现一组指定的方法,其实现是NS(Mutable)Array继承,当你继承。请阅读NSMutableArray documenatationNSArray documentation中的“子类别备注”部分,了解您必须执行的方法列表,其中错误消息指示包括count

HTH