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