为什么我的NSMutableArray子类不能按预期工作?

Lil*_*oke 18 objective-c nsmutablearray

我已经将NSMutableArray子类化如下:

基类:

@interface MyBaseMutableArray : NSMutableArray {
    // Database variables
    NSString * databaseName;
    NSString * databasePath;
}

@property (nonatomic, retain) NSString * databasePath;

- (id)initWithContentsOfSQLiteDB:(NSString *)dbTable;
-(void) checkAndCreateDatabase;
-(void) readFromDatabase;

@end
Run Code Online (Sandbox Code Playgroud)

子类:

@interface IngredientsMutableArray : MyBaseMutableArray
{

}

-(void) readFromDatabase;

@end
Run Code Online (Sandbox Code Playgroud)

当我创建一个IngredientsMutableArray时,我执行以下操作:

IngredientsMutableArray * i  = [[IngredientsMutableArray alloc]
    initWithContentsOfSQLiteDB:@"MyIngredientsDB.sql"];
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试执行[self addObject:ingred]时,我抛出异常如下:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSArray count]: method only defined for abstract class.  Define -[IngredientsMutableArray count]!'
Run Code Online (Sandbox Code Playgroud)

我相信我没有正确初始化NSMutableArray.我打算给我们initWithCapaciity,但我不知道SQL调用之前的计数.我认为我忽略了一些显而易见的事情,但对于Objective CI来说,有些新手却有点迷茫.

任何帮助表示赞赏.

Ste*_*ton 25

根据您需要的文档:

覆盖的方法

NSMutableArray的方法在概念上基于这些原始方法:

insertObject:atIndex:

removeObjectAtIndex:

addObject:

removeLastObject

replaceObjectAtIndex:withObject:
Run Code Online (Sandbox Code Playgroud)

在子类中,您必须覆盖所有这些方法,尽管您可以仅使用前两个实现所需的功能(但这可能效率很低).您还必须覆盖NSArray类的基本方法.

真正的答案是你真的不想成为它的子类.有两种选择:

  1. 使用类别
  2. 创建一个具有NSArray成员变量的新类

在这种情况下,我想我会选择第二种选择.

通常,您倾向于将系统类子类化为比C#或Java更少的子类.


Ter*_*cox 5

您不想继承NSArray或NSMutableArray。这是一个类集群。从NSArray文档

NSArray的任何子类都必须覆盖原始实例方法count和objectAtIndex:。这些方法必须在您为集合的元素提供的后备存储上操作。对于此后备存储,您可以使用静态数组,标准NSArray对象或其他某种数据类型或机制。您也可以选择部分或全部覆盖要为其提供替代实现的任何其他NSArray方法。

如在这些文档中所建议的那样,请尝试使用类别或组成,而不要继承。