实现自定义NSMutableArray

时间:2012-02-05 11:52:24

标签: iphone objective-c ios nsmutablearray

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

    @interface Course : NSObject {
        NSString *className;
        NSString *classGrade;
        NSInteger creditHours;
    }

该课程将存储一系列课程:

    @interface AllCourses : NSObject : NSMutableArray{
        NSMutableArray *arrClasses;
    }

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

2 个答案:

答案 0 :(得分:6)

首先。如果你想扩展一个类,你需要这样做:

@interface YourCustomClass : SuperClass

以这种方式,YourCustomClass会继承SuperClass的属性和/或方法。

关于您的问题,Apple doc在NSMutableArray Class Reference

中说
  

通常没有理由继承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];

希望它有所帮助。

修改

要覆盖方法,请在.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 

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

替代方案是:

  1. 使用类别
  2. 使用合成(在课堂内使用NSMutableArray实例变量)
  3. 最后,我还建议您阅读以下讨论:why-doesnt-my-nsmutablearray-subclass-work-as-expected。特别是,你必须注意

      

    通常,您倾向于将系统类子类化为次要的次数   你会用C#或Java。

    正如 Stephen Darlington 所说的那样。

答案 1 :(得分:1)

通常,对这类东西进行子类化并没有什么用处。你最好使用一个类别。但是,如果你真的坚持继承子类,那么你应该如何做到这一点。

首先,您的界面声明是错误的。试试这种方式:

@interface AllCourses : NSMutableArray
@end

此外,你不需要在你的可变数组中使用一个可变数组,你所要做的就是使用self,比如

[self addObject:<your object here>];