NSArray和NSMutableArray的引用提到了创建子类的可能性,但这只能通过提供自己的后备存储和方法的实现来实现
count
objectAtIndex:
代表NSArray
,以及
insertObject:atIndex:
removeObjectAtIndex:
addObject:
removeLastObject
replaceObjectAtIndex:withObject:
代表NSMutableArray
。这可能会产生误导,因为它导致程序员认为通过简单的方法无法继承NSArray
和NSMutableArray
。
认为不可能创建使用现有后备存储的“简单”子类(即使您不直接访问它们),仍然可以通过一些“解决方法”。
因此,虽然我正在寻找仍然能够继承它们的可能性,但我有一个简单的想法:只需创建子类并使用NSArray
或NSMutableArray
的实例作为后备存储。
以下是它的工作原理:
#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
如果您想要NSArray
的子类,则只提供标题为NSArray
的部分。
您现在可以从“自定义NSArray
子类的实现”中继承子类,并按照您的意愿工作。
希望这有助于......和平!
Tomen =)
答案 0 :(得分:2)
对NSMutableArray
进行子类化并使用NSMutableArray
进行支持是一个毫无意义且可怕的想法。如果您要将 NS(Mutable)Array 这些基本的子类化为子类,那么至少有理由这样做。例如,我有子类NSMutableArray
并使用C数组作为后备,以使其充当circular buffer,因此前面的插入和移除速度与后面一样快。 (谷歌CHCircularBuffer
,如果你很好奇。)
但是,大多数情况下,子类化很少或没有意义。此外,虽然创建一个简单的子类可能很简单,但创建一个有用且有意义的子类并非易事。