有关NSArray和NSMutableArray的参考文献提到了可以创建子类,但这只可能通过提供自己的备份存储和方法实现。
count
objectAtIndex:
对于NSArray
,以及
insertObject:atIndex:
removeObjectAtIndex:
addObject:
removeLastObject
replaceObjectAtIndex:withObject:
对于NSMutableArray
。这可能会让程序员误以为简单地通过手段不可能子类化NSArray
和NSMutableArray
。
尽管无法创建利用现有后备存储(即使您不直接访问它们)的“简单”子类,但仍然可以通过一些“解决方法”实现。
因此,当我在寻找仍然能够子类化它们的可能性时,我有一个简单的想法:只需创建子类并使用NSArray
或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
子类的实现”中进行子类化,并按照你的意愿工作。希望这能有所帮助...平安!Tomen =)
NSArray
或NSMutableArray
的原因是因为它们是类簇 - 更多信息请参见:http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html - Carl Norum