Objective c 将NSArray&;可变数组

Objective c 将NSArray&;可变数组,objective-c,nsmutablearray,nsarray,subclassing,Objective C,Nsmutablearray,Nsarray,Subclassing,和的参考文献提到了创建子类的可能性,但这只有通过提供您自己的备份存储和方法实现才能实现 计数 objectAtIndex: 对于NSArray,以及 insertObject:atIndex: removeObjectAtIndex: addObject: removeLastObject replaceObjectAtIndex:withObject: 对于NSMutableArray。这可能会产生误导,因为它会导致程序员认为,通过简单的方法将NSArray和NSMutableArra

和的参考文献提到了创建子类的可能性,但这只有通过提供您自己的备份存储和方法实现才能实现

  • 计数

  • objectAtIndex:

对于
NSArray
,以及

  • insertObject:atIndex:

  • removeObjectAtIndex:

  • addObject:

  • removeLastObject

  • replaceObjectAtIndex:withObject:

对于
NSMutableArray
。这可能会产生误导,因为它会导致程序员认为,通过简单的方法将
NSArray
NSMutableArray
子类化是不可能的

虽然不可能创建它们的“简单”子类来利用现有的备份存储(即使您不直接访问它们),但通过一些“变通方法”仍然是可能的

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

以下是它的工作原理:

CSSMutableArray.h 如果要对
NSArray
进行子类化,则只提供标题为
NSArray
的部分。 现在,您可以从“自定义
NSArray
子类的实现”中创建子类,并按照自己的意愿工作

希望这有助于。。。和平


Tomen=)

NSMutableArray
子类化并用
NSMutableArray
支持它是一个毫无意义和可怕的想法。如果您要将一些基本的东西子类化为NS(可变)数组,至少有这样做的理由。例如,我有子类
NSMutableArray
,并用一个C数组来支持它,使其充当a,因此前面的插入和删除速度与后面的一样快。(谷歌
CHCircularBuffer
如果你好奇的话。)
然而,大多数情况下,子类化几乎没有意义。此外,尽管创建一个平凡的子类可能很简单,但创建一个有用且有意义的子类却并非平凡。

#1,这篇文章不是一个问题#2、您通常不想将
NSArray
NSMutableArray
子类化的原因是因为它们是类群集-此处提供更多信息:谁说“您不能将NSMutableArray和NSArray子类化”?苹果甚至在文档中提到了如何做到这一点,但他们似乎不鼓励这样做。否则,对它进行子类化就不会那么难了。在我看来,有明确的代码可以检查和防止子类化,而无需提供自定义的支持存储。您确实可以将NSArray子类化,这是苹果在自己的文档中声明的。来自:“通常没有什么理由将NSArray子类化。该类在维护对象的有序集合方面做得很好。但在某些情况下,自定义NSArray对象可能会派上用场。”此外,请阅读文档的“子类化注释”部分,它准确地描述了子类NSArray需要做什么。这是一个很好的例子,在大多数情况下不需要子类NSMutableArray。根据文档,在两端添加或删除对象需要固定的时间(请参阅)。我建议阅读Bartosz Ciechanowski的文章。这是非常相关的。
#import <Foundation/Foundation.h>


@interface CSSMutableArray : NSMutableArray {
    NSMutableArray *_backingStore;
}

@end
#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