【问题标题】:"-[NSArray count] only defined for abstract class" exception when using an NSArray subclass使用 NSArray 子类时的“-[NSArray count] 仅为抽象类定义”异常
【发布时间】:2017-05-08 09:58:16
【问题描述】:

我有一个 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

在 main 下导入所有内容

CharacterArray *characters;

在主方法中

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

【问题讨论】:

  • 错误消息表明您已尝试将NSArray 子类化,尽管可能,但通常不需要或不推荐这样做。您应该在您的问题中添加您的课程CharacterArray 的详细信息以及哪些变量具有该类型,以便帮助人们帮助您。
  • @CRD 我添加了 CharacterArray 类和标题。我不得不使用这种类型的数组类来完成我的作业。
  • 为什么CharactersArray 继承自NSMutableArray,而您似乎使用的似乎接近NSMutableArray 的只是您的财产characters?有道理。您需要定义 -(NSInteger)count 方法,它可能返回 self.characters.count,但同样,这似乎对从 NSMutableArray 继承毫无意义。
  • @Larme 实际上我不知道为什么我们必须创建一个 CharactersArray 类,这是我的第一个目标 c 任务。它在规范中为它使用一个类。如果我只能在 main 中创建数组,我就可以做到。
  • @Larme 我遇到了同样的错误,然后我尝试使用 [characters removeObjectAtIndex:rand2];我需要在 CharacterArray 中定义 removeObjectAtIndex。我该怎么做才能删除随机选择的特定索引

标签: objective-c sorting cocoa nsmutablearray


【解决方案1】:

对于没有使用子类而出现此错误的任何人,请检查您是否使用[[NSArray new] initWith...] 而不是[[NSArray alloc] initWith...]

【讨论】:

    【解决方案2】:

    您确定需要创建CharacterArray并且它应该是NS(Mutable)Array 的子类。检查您的意图是否不是您应该使用NS(Mutable)Arrayinstance characterArray,这似乎最有可能出现在“第一个Objective-C 作业”中;或者你打算编写你的类继承自NS(Mutable)Array,不太可能但可能。

    您最不可能知道NS(Mutable)Array 不能被简单地子类化。请注意您的错误包含:

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

    Objective-C 并没有真正的“抽象”类,但系统框架确实使用了一种称为 class clusters 的设计,它可以表现出一些相同的行为,这就是错误消息的含义试图指出。对于类集群,简单继承不能像公共类那样工作,NS(Mutable)Array 在这种情况下,实际上并没有实现它的许多方法的行为,而是依赖于集群中的其他类来这样做——这些实现是被公共类的子类继承。

    听起来很复杂?这就是为什么它在“第一次作业”中令人惊讶。

    也就是说,实际上子类化NS(Mutable)Array 并不难,只要您遵循规则,即实现一组指定的方法,当您子类化时,这些方法的实现继承自NS(Mutable)Array。阅读NSMutableArray documenatationNSArray documentation 中的“子类化注释”部分,了解您必须实现的方法列表,如错误消息所示,其中包括count

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多