3

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

  • count

  • objectAtIndex:

对于NSArray, 以及

  • insertObject:atIndex:

  • removeObjectAtIndex:

  • addObject:

  • removeLastObject

  • replaceObjectAtIndex:withObject:

NSMutableArray. 这可能会产生误导,因为它会导致程序员认为不可能通过简单的方法对 和 进行子类NSArrayNSMutableArray

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

因此,当我在寻找仍然能够对它们进行子类化的可能性时,我有一个简单的想法:只需创建子类并使用NSArrayor的实例NSMutableArray作为后备存储。

下面是它的工作原理:

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子类的实现”中进行子类化并按照您的意愿工作。

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

托门 =)

4

1 回答 1

2

用 an子类化NSMutableArray和支持它NSMutableArray是一个毫无意义和可怕的想法。如果您要对NS(Mutable)Array等基本的东西进行子类化,至少有理由这样做。例如,我有子类NSMutableArray并用 C 数组支持它,使其充当循环缓冲区,因此前面的插入和删除与后面的速度一样快。(CHCircularBuffer如果你好奇的话,谷歌一下。)然而,大多数时候,子类化几乎没有意义。此外,虽然创建一个普通的子类可能很简单,但创建一个有用且有意义的子类并非易事。

于 2011-02-20T05:47:52.830 回答