子类化NSArray& NSMutableArray里

时间:2011-02-18 18:23:08

标签: objective-c nsmutablearray nsarray subclassing

NSArrayNSMutableArray的引用提到了创建子类​​的可能性,但这只能通过提供自己的后备存储和方法的实现来实现

  • count

  • objectAtIndex:

代表NSArray,以及

  • insertObject:atIndex:

  • removeObjectAtIndex:

  • addObject:

  • removeLastObject

  • replaceObjectAtIndex:withObject:

代表NSMutableArray。这可能会产生误导,因为它导致程序员认为通过简单的方法无法继承NSArrayNSMutableArray

认为不可能创建使用现有后备存储的“简单”子类(即使您不直接访问它们),仍然可以通过一些“解决方法”。

因此,虽然我正在寻找仍然能够继承它们的可能性,但我有一个简单的想法:只需创建子类并使用NSArrayNSMutableArray的实例作为后备存储。

以下是它的工作原理:

CSSMutableArray.h

#import <Foundation/Foundation.h>


@interface CSSMutableArray : NSMutableArray {
    NSMutableArray *_backingStore;
}

@end

CSSMutableArray.m

#import "CSSMutableArray.h"


@implementation CSSMutableArray

- (id) init
{
    self = [super init];
    if (self != nil) {
        _backingStore = [NSMutableArray new];
    }
    return self;
}

- (void) dealloc
{
    [_backingStore release];
    _backingStore = nil;
    [super dealloc];
}

#pragma mark NSArray

-(NSUInteger)count
{
    return [_backingStore count];
}

-(id)objectAtIndex:(NSUInteger)index
{   
    return [_backingStore objectAtIndex:index];
}

#pragma mark NSMutableArray

-(void)insertObject:(id)anObject atIndex:(NSUInteger)index
{
    [_backingStore insertObject:anObject atIndex:index];
}

-(void)removeObjectAtIndex:(NSUInteger)index
{
    [_backingStore removeObjectAtIndex:index];
}

-(void)addObject:(id)anObject
{
    [_backingStore addObject:anObject];
}

-(void)removeLastObject
{
    [_backingStore removeLastObject];
}

-(void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject
{   
    [_backingStore replaceObjectAtIndex:index withObject:anObject];
}

@end

如果您想要NSArray的子类,则只提供标题为NSArray的部分。 您现在可以从“自定义NSArray子类的实现”中继承子类,并按照您的意愿工作。

希望这有助于......和平!

Tomen =)

1 个答案:

答案 0 :(得分:2)

NSMutableArray进行子类化并使用NSMutableArray进行支持是一个毫无意义且可怕的想法。如果您要将 NS(Mutable)Array 这些基本的子类化为子类,那么至少有理由这样做。例如,我有子类NSMutableArray并使用C数组作为后备,以使其充当circular buffer,因此前面的插入和移除速度与后面一样快。 (谷歌CHCircularBuffer,如果你很好奇。)  但是,大多数情况下,子类化很少或没有意义。此外,虽然创建一个简单的子类可能很简单,但创建一个有用且有意义的子类并非易事。