iphone - Objective C 中的继承问题

标签 iphone objective-c xcode inheritance

我创建了一个“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 Flipswitch[1756:20b] 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“< strong> -[NSMutableArray initWithCapacity:]: 仅为抽象类定义的方法。定义 -[SDMutableGrid initWithCapacity:]!' 2009-08-12 15:27:02.080 Flipswitch[1756:20b] 堆栈:( 807902715, 2536648251, 808283725, 808264737, 13690, 11018, 10185, 814713539, 814750709, 814739251, 814722434, 814748641, 839148405, 807687520, 807683624, 814715661, 814752238, 10052, 9906 )

最佳答案

简短而简单的答案:不要创建 NSArray 的子类。最好在 NSArray 上创建一个类别或创建一个 NSObject 子类,该子类具有您与之交谈的 NSArray ivar。

较长的技术性答案:NSArray 是一个 class cluster .这意味着它实际上不是一个类,而是许多在 NSArray 抽象类接口(interface)下运行的类,每个类都以不同的方式实现(比如,一个实现用于小数组,另一个实现用于大数组等)。要创建类簇的子类,您必须实现您继承自的抽象类的所有原始方法、管理您自己的存储并基本上重新实现您希望通过子类化免费获得的所有内容。

更简单地说,如果您不需要额外的 ivar,您可以只创建一个类别。如果您想要一个行为类似于具有附加状态的数组的对象,您可以创建一个具有 NSArray 的类并使用 Objective-C 消息转发将除您的自定义行为之外的所有内容转发到该类。

关于iphone - Objective C 中的继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268261/

相关文章:

iphone - 关于GCD和线程类之间区别的疑问

ios - 我如何编写iphone 3.5英寸屏幕和4英寸屏幕的代码

ios - 如何计算iOS中 float 后的位数?

iphone - 如何检测iphone中的某个按钮是否被点击

ios - 如何使用 FBSDKShareLink 在 Facebook 上分享链接?

ios - 此应用程序的 XCode 项目类型? OpenGL ES 还是基于 View ?

ios - 如何访问字典数组并在 Objective C 中使用字典对象?

iphone - 检测特定的 iPhone/iPod touch 型号

objective-c - 模态 session 需要 Mac 上的模态窗口错误

ios - linphone 编译问题(刚从 git 下载)