Objective C 中的继承问题

2024-04-15

我创建了一个“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(使用前将#替换为@)

Objective C 中的继承问题 的相关文章

随机推荐

  • Java 1.3 String.replaceAll() ,替换

    我正在和一些非常老的人一起工作Java 1 3准确地说 我正在尝试清理一些String通过删除非字母字符 标点符号和数字等 进行输入 通常我会做类似的事情 String replaceAll A Za z 然而 replaceAll 被介绍
  • c#:以 100% 质量保存 JPEG 时图像质量降低

    我只是加载 JPEG 图像并保存它 而不对其进行任何操作 但图像质量明显下降 这是代码 Bitmap imgOutput new Bitmap D image jpg Graphics outputGraphics Graphics Fro
  • SMS 是注册 Google App Engine 的唯一方式吗?

    我没有手机 但 Google App Engine 需要短信来验证帐户 还有其他方法可以完成注册吗 我很惊讶他们不使用 Gmail 帐户来执行此操作 编辑 谷歌为我创建了一个 问题解决了 否 如果您没有办法接收短信 您可以填写短信问题表格
  • 有没有办法在 Angular 2 中以可折叠格式显示有效的 json?

    有没有办法在 Angular 2 中以可折叠格式显示有效的 json pre data json pre 将很好地显示 json 但我需要能够折叠 展开其中的各个对象 尝试 ngx json viewer 它非常适合显示具有可展开 可折叠节
  • 向下滑动显示textview动画

    我有兴趣在我的 Android 应用程序中添加一个切换 TextView 可见性的动画 我希望它不只是将可见性设置为 Visibility GONE 和 Visibility VISIBLE 相反 我希望它具有类似 jquery 的幻灯片效
  • SessionId/身份验证令牌生成的最佳实践

    我见过有人使用 UUID 来生成身份验证令牌 然而 在RFC 4122 http www ietf org rfc rfc4122 txt据称 不要假设 UUID 很难猜测 不应该使用它们 作为安全功能 仅拥有即可授予的标识符 访问 例如
  • C - 我使用什么选项来生成列表文件?

    我是 C 编程语言和 gcc 的新手 我正在尝试破译一个相当复杂的 C 程序 我想阅读一个有用的列表文件而不是源文件 我正在寻找由 gcc 编译器创建的列表文件 其中包含 所有包含的源代码 xref 交叉引用列表 变量声明位置的引用 例如
  • Asp.Net Core API 禁用启动完成消息

    作为我的应用程序的一部分 我有一个 Net Core API 项目 与该项目作为自己的进程运行的大多数情况不同 我让 API 在线程等单个进程中运行 另外 对于我的项目 我实现了一个自定义日志系统来满足我的需求 但是 我遇到了一个小问题 每
  • 如何将accessibilityIdentifier设置为UIAlertController?

    这就是我简单创建的方式UIAlertController并将其呈现在屏幕上 private class func showAlertWithTitle title String message String let alert UIAler
  • 使用 gdb 在指定的可执行文件之外单步执行汇编代码会导致错误“无法找到当前函数的边界”

    我在 gdb 的目标可执行文件之外 甚至没有与该目标对应的堆栈 无论如何 我想单步执行 以便我可以验证汇编代码中发生了什么 因为我不是 x86 汇编方面的专家 不幸的是 gdb 拒绝进行这种简单的汇编级调试 它允许我设置并停止在适当的断点上
  • 如何以相反的顺序遍历 boost::dynamic_bitset ?

    有没有办法以相反的顺序遍历 boost dynamic bitset 我的意思是我们通常通过 find first 找到第一个设置位 然后使用 find next 继续 是否有任何相应的 find last 和 find prev 或任何其
  • Angular Elements / Zone.js 事件侦听器减慢主页速度

    我们有一个 Angular 7 项目 它使用 Angular 元素生成自定义元素 此自定义元素用于 React 项目和 AngularJS 项目 当自定义元素的代码加载到这些项目之一中时 即使自定义元素没有渲染到 DOM 中 网站速度也会减
  • sequelize Model.hasOne 错误:模型未与 ModelTwo 关联

    我已将sequelizejs 集成到我的express 框架中 我配置了所有模型 并尝试用它构建我的第一个查询 我不断收到错误 错误 模型未与 ModelTwo 关联 app get function req res db Member f
  • 错误“无法加载 Boto 的 S3 绑定。”

    我遵循了提供的非常简洁的指南Django 存储 http django storages readthedocs org en latest backends amazon S3 html 从本地文件存储转换 并遇到了此异常 无法加载 Bo
  • 空查询时的最大返回值

    我有这样的疑问 int maxShoeSize Workers Where x gt x CompanyId 8 Max x gt x ShoeSize 将会有什么maxShoeSize如果8号公司根本没有工人呢 UPDATE 如何更改查询
  • 格式 xml,漂亮的打印

    我知道有两种 漂亮打印 或格式化 xml 的方法 外壳工具 http www shell tools net 技巧 38 使用通用身份样式表和 Xalan 漂亮打印 XML http etutorials org XML xml hacks
  • 以函数作为模板参数的部分特化拒绝

    得到了这段代码 该代码可以与以前版本的 gcc 一起编译良好 template
  • 有没有办法获取历史 YouTube 订阅者信息?

    目前 我正在通过以下请求检索每日订阅者信息 var videoOptions part snippet contentDetails statistics id videoIds Send request youtube videos li
  • Jquery UI 结合了可排序和可拖动

    我正在尝试组合一个可拖动面板 顶部 和一个可排序面板 底部 拖动工作正常 但排序失败 这是我的 JS 小提琴 http jsfiddle net dmUKY 9 http jsfiddle net dmUKY 9 拖放和排序功能共享drop
  • Objective C 中的继承问题

    我创建了一个 SDMutableGrid 类 以便我可以使用网格 它只是 NSMutableArray 的子级 其中包含的数组数等于网格中的行数 目前 程序在真正启动之前就退出了 似乎是因为为 NSMutableArray 定义的方法在某种