实现自定义NSMutableArray

Sag*_*agi 2 iphone objective-c nsmutablearray ios

我想创建自己的自定义对象NSMutableArray:

    @interface Course : NSObject {
        NSString *className;
        NSString *classGrade;
        NSInteger creditHours;
    }
Run Code Online (Sandbox Code Playgroud)

这个类将存储一系列课程:

    @interface AllCourses : NSObject : NSMutableArray{
        NSMutableArray *arrClasses;
    }
Run Code Online (Sandbox Code Playgroud)

我希望"AllCourses"继承自NSMutableArray,所以我可以像任何其他NSMutableArray对象一样使用它,并从中添加\ remove课程并将其加载到tableView等...所以我的问题是,如果你会这么善良,是我对"AllCourses"的实现应该是什么样的?

Lor*_*o B 6

首先.如果要扩展类,则需要执行以下操作:

@interface YourCustomClass : SuperClass
Run Code Online (Sandbox Code Playgroud)

以这种方式YourCustomClass继承你的属性和/或方法SuperClass.

关于您的问题,Apple doc在NSMutableArray类参考中

通常没有理由继承NSMutableArray.该类完成了它的设计目的 - 维护一个可变的,有序的对象集合.

您可以在此stackoverflow主题中找到相同的建议:should-i-subclass-the-nsmutablearray-class.

如果你想继承子类NSMutableArray,请参阅第一个链接(NSMutableArray类参考).您必须覆盖5个方法(请参阅Ovveride方法一节).

在我看来,你可以用NSMutableArray传统的方式:创建一个NSMutableArray实例并向其添加对象(这里是一个简单的例子).

NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
NSNumber *myNumber = [NSNumber numberWithInt:2];
[myArray addObject:myNumber];
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

编辑

要覆盖方法,请在.m文件中插入该方法并在其中添加一些逻辑.例如(这里只是伪代码):

//.h

@interface YourClass: NSMutableArray

@end

//.m

@implementation YourClass

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index
{
   // your logic here
}

// do the same for other ones

@end 
Run Code Online (Sandbox Code Playgroud)

但是,我再次建议你找到一种不同的方法来实现它,因为在这种情况下扩展一个NSMutableArray类并获得一个像原始类一样的全功能类非常困难.

替代方案是:

  1. 使用类别
  2. 使用组合(在你的类中使用NSMutableArray实例变量)

最后,我还建议您阅读以下讨论:why-doesnt-my-nsmutablearray-subclass-work-as-expected.特别是,你必须注意到这一点

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

斯蒂芬达林顿说.