我创建了一个“SDMutableGrid”类,以便我可以使用网格。它只是 NSMutableArray 的子级,其中包含的数组数等于网格中的行数。
目前,程序在真正启动之前就退出了,似乎是因为为 NSMutableArray 定义的方法在某种程度上不适用于 SDMutableGrid,有人知道为什么吗?
这是 .h :
#import <Foundation/Foundation.h>
#import "SDDimensions.h"
@interface SDMutableGrid : NSMutableArray {
SDDimensions dimensions;
}
@property (nonatomic) SDDimensions dimensions;
- (id)initWithDimensions:(SDDimensions)newDimensions;
- (void)addObject:(id)anObject toRow:(NSUInteger)row;
@end
这是 .m :
#import "SDMutableGrid.h"
@implementation SDMutableGrid
@synthesize dimensions;
- (void)setDimensions:(SDDimensions)newDimensions {
if (newDimensions.width < dimensions.width) {
NSMutableArray *anArray;
NSRange aRange = NSMakeRange(newDimensions.width, dimensions.width - newDimensions.width);
for (NSUInteger i = 0; i < MIN(dimensions.height,newDimensions.height); i++) {
anArray = [self objectAtIndex:i];
[anArray removeObjectsInRange:aRange];
}
}
dimensions.width = newDimensions.width;
if (newDimensions.height > dimensions.height) {
for (NSUInteger i = dimensions.height; i < newDimensions.height; i++) {
[self addObject:[[NSMutableArray alloc] initWithCapacity:dimensions.width]];
}
} else if (newDimensions.height < dimensions.height) {
[self removeObjectsInRange:NSMakeRange(newDimensions.height, dimensions.height - newDimensions.height)];
}
dimensions.height = newDimensions.height;
}
- (id)initWithDimensions:(SDDimensions)newDimensions {
if (self = [super initWithCapacity:newDimensions.height]) {
NSMutableArray *anArray;
for (NSUInteger i = 0; i < newDimensions.height; i++) {
anArray = [[NSMutableArray alloc] initWithCapacity:newDimensions.width];
NSLog(@"Got this far");
[self addObject:anArray];
NSLog(@"woot");
[anArray release];
}
NSLog(@"Finished Initializing grid");
}
return self;
}
- (void)addObject:(id)anObject toRow:(NSUInteger)row {
[[self objectAtIndex:row] addObject:anObject];
}
@end
这是控制台上显示的内容:
2009-08-12 15:27:02.076 翻转开关[1756:20b]由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“
简短、简单的答案:不要创建 NSArray 的子类。最好在 NSArray 上创建一个类别,或者创建一个具有与您交谈的 NSArray ivar 的 NSObject 子类。
长而技术性的答案:NSArray 是一个类簇 http://developer.apple.com/IPhone/library/documentation/General/Conceptual/DevPedia-CocoaCore/ClassCluster.html。这意味着它实际上不是一个类,而是在 NSArray 抽象类接口下运行的许多类,每个类都以不同的方式实现(例如,一种实现用于小数组,另一种实现用于大数组,等等)。要创建类簇的子类,您必须实现您继承的抽象类的所有原始方法,管理您自己的存储,并基本上重新实现您希望通过子类化免费获得的所有内容。
更简单地说,如果不需要额外的 ivars,您可以创建一个类别。如果您想要一个行为类似于具有附加状态的数组的对象,您可以创建一个具有 NSArray 的类,并使用 Objective-C 消息转发将除自定义行为之外的所有内容转发到该类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)