如何创建 NSInputStream 的子类?

2023-12-11

我想创建 NSInputStream 的子类。简单地说,我尝试编写如下代码,

@interface SeekableInputStream : NSInputStream
{
    NSUInteger startOffset;
    NSUInteger totalReadLen;
}

- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len;
- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len;
- (BOOL)hasBytesAvailable;
- (void)open:(NSUInteger)offset;

@end

并且,我使用了如下所示的类。

SeekableInputStream *stm = [[SeekableInputStream alloc] initWithURL:url];

然后,在运行时,我可能会遇到以下错误消息。

-[SeekableInputStream initWithURL:]: 无法识别的选择器发送到实例 0x10018ff30

我没有故意重写 initWithURL 来使用父方法。 据我所知,派生类可以使用父类的方法,不是吗?

像initWithURL这样的扩展方法不能继承吗?

有人告诉我如何对 NSInputStream 进行子类化吗?


来自 NSStream.h

// NSStream is an abstract class encapsulating the common API to NSInputStream and NSOutputStream.
// Subclassers of NSInputStream and NSOutputStream must also implement these methods.
@interface NSStream : NSObject
- (void)open;
- (void)close;

- (id <NSStreamDelegate>)delegate;
- (void)setDelegate:(id <NSStreamDelegate>)delegate;
 // By default, a stream is its own delegate, and subclassers of NSInputStream and NSOutputStream must maintain this contract. [someStream setDelegate:nil] must restore this behavior. As usual, delegates are not retained.

- (id)propertyForKey:(NSString *)key;
- (BOOL)setProperty:(id)property forKey:(NSString *)key;

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;

- (NSStreamStatus)streamStatus;
- (NSError *)streamError;
@end

// NSInputStream is an abstract class representing the base functionality of a read stream.
// Subclassers are required to implement these methods.
@interface NSInputStream : NSStream
- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len;
// reads up to length bytes into the supplied buffer, which must be at least of size len. Returns the actual number of bytes read.

- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len;
// returns in O(1) a pointer to the buffer in 'buffer' and by reference in 'len' how many bytes are available. This buffer is only valid until the next stream operation. Subclassers may return NO for this if it is not appropriate for the stream type. This may return NO if the buffer is not available.

- (BOOL)hasBytesAvailable;
// returns YES if the stream has bytes available or if it impossible to tell without actually doing the read.
@end

如您所见,没有 initWithURL 函数。所以,你的super不起作用,因为它确实不存在。正如 MrTJ 所说,它是一个类别类。它的定义是:

// The NSInputStreamExtensions category contains additional initializers and convenience routines for dealing with NSInputStreams.
@interface NSInputStream (NSInputStreamExtensions)
- (id)initWithURL:(NSURL *)url NS_AVAILABLE(10_6, 4_0);

所以,我认为如果你在你的子类中使用它,它就可以工作。

#import <Foundation/NSStream.h>

您需要导入类别。请记住,您不能对类别进行子类化,只需覆盖它,然后就无法调用(或者如果可以,我不知道如何)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 NSInputStream 的子类? 的相关文章

  • 从 NSString 的第一行删除换行符

    我怎样才能删除第一个 nNSString 中的字符 编辑 只是为了澄清一下 我想做的是 如果字符串的第一行包含 n 字符 请将其删除 否则不执行任何操作 即 如果字符串是这样的 nhello this is the first line n
  • 处理 NSPropertyListSerialization 中的 CFNull 对象

    在我的应用程序中 我尝试序列化服务器响应字典并将其写入文件系统 但对于某些响应 我收到错误 属性列表格式无效 原因是服务器响应中的 CFNull 对象 现在 服务器响应将不断变化 因此我没有明确的方法来删除 CFNull 对象 下面是我的代
  • 无限 UIScrollView 在 iOS4.3 中出现奇怪的行为,而不是 iOS5

    我已经实现了一个包含 UIView 的无限 UIScrollView 在 iOS5 模拟器和 iPhone 中滚动时 效果非常好 但在 iOS 4 3 sim 和手机 中 情况有点疯狂 滚动条传递的视图比应有的多 大约比 iOS5 多 10
  • Apple 推送通知徽章编号

    我开发了服务器端应用程序 以在收到新通知后将徽章编号维护为递增或递减 并在看到通知后删除它工作正常 但是显示徽章时存在一些问题 实际情况是 在设备上收到新通知后 我单击取消按钮 然后徽章编号正确显示 但之后我将打开应用程序并关闭应用程序徽章
  • 使用 iOS 设备作为 TCP 客户端 - 无 Bonjour

    我想使用 iOS 设备作为 TCP 客户端 但我找不到可理解的 API 指南 示例来说明如何做到这一点 我试过SimpleNetworkStreams and PictureSharing 但他们都使用 Bonjour 我可以轻松建立 UD
  • 处理核心数据中的重复条目

    我有一个允许用户保存收藏夹的应用程序 我正在使用 Core Data 将收藏夹存储为托管对象 我已经编写了一些代码来防止存储重复项的可能性 但我想知道是否有更好的方法来做到这一点 每个收藏夹对象都有一个唯一的 ID 字段 在下面的代码中 我
  • 出现“重复接口定义”错误,肯定需要 #import 头文件

    我正在帮助开发一个 iOS 项目 其中包含 AppDelegate 中许多不同类所共有的许多方法和定义 因此 在每个类的 h 文件中 我使用 import AppDelegate h 在我需要访问已将 AppDelegate 导入到另一个导
  • 适用于 iOS (iPhone/iPad) 的 XMPP 库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • NSOpenPanel setAllowedFileTypes

    我有一个 NSOpenPanel 但我想让它只能选择 PDF 文件 我正在寻找类似的东西 NOT WORKING NSOpenPanel panel panel NSOpenPanel openPanel panel setFloating
  • iOS 5 中的方法 Swizzling?

    Apple 在 iOS 5 中阻止了 Method Swizzling 吗 我做了一些尝试 发现带有 Method Swizzling 的应用程序可以在 iOS 4 上运行 但不能在 iOS 5 上运行 注意 该应用程序适用于 iOS 5
  • iPhone 到 Mac 开发

    我是一名 iPhone 开发人员 非常了解该框架 随着 Mac 应用商店即将推出 我想了解有关 Mac 开发的更多信息 有没有好的指南 教程 等等 帮助过渡 我环顾四周并没有发现太多 谢谢您的帮助 您基本上需要了解之间的区别UIKit an
  • alloc 和 init 他们实际做了什么

    有人可以向我解释一下 init 和 alloc 在 Obj C 中的作用吗 我正在阅读这本 obj c 书 其中给出了创建对象的示例 但它并没有真正详细介绍它的作用 alloc返回什么 init 返回什么 Animal k Animal a
  • iOS 7 UIBarButtonItem 字体在点击时发生变化

    我正在尝试改变我的UIBarButtonItem字体 ViewController 加载时看起来不错 但是 如果我点击栏按钮 或者向右滑动 就像移动到上一个 ViewController 但然后拉回到当前的 ViewController 字
  • 解析 URL 字符串以获取键值的最佳方法?

    我需要解析一个 URL 字符串 如下所示 ad eurl http www youtube com video 4bL4FI1Gz6s hl it IT iv logging level 3 ad flags 0 endscreen mod
  • 在核心图形中创建拼贴的多个剪切矩形

    我正在创建一个与其他图像元素相结合的拼贴画 这是一些 ASCII 艺术来解释我正在做的事情 Given images A B and C AAA BBB CCC AAA BBB CCC AAA BBB CCC I take part of
  • 在 Objective-c 中获取对象名称

    假设我有一个 Foo 类和该类 myFoo 的一个实例 Foo myFoo 是否有任何方法 dispalyFooObjectName 可以显示对象的名称 例如 NSLog i was called from s myFoo dispalyF
  • 何时为自定义视图创建 Interface Builder 插件?

    您何时建议使用插件将自定义视图集成到 Interface Builder 中 当浏览苹果的时候Interface Builder 插件编程指南 http developer apple com documentation Developer
  • iOS 6.0 Quicklook QLPreviewController 错误:“无法找到已加载代理的预览项目”

    我的应用程序一直使用 QLPreviewController 来显示所有类型的文件 在 iOS 5 x 中 它似乎做得很好 现在 在 iOS 6 0 中 我收到一个错误 它显示了控制器 但带有恒定的加载指示器 并且从未实际加载任何内容 日志
  • 我们可以传递一个参数来查看某个类中其他类的加载情况或视图将出现吗

    抱歉 如果这不是标准问题 但现在您的解决方案可以帮助我 在我的应用程序中 我有两个类 ClassA and ClassB ClassB其中有一个表视图 我正在使用查询来填充表视图ClassB 但是我必须查询的列名是我从中得到的ClassA
  • 不要自动切换到更高端的独立GPU

    正如本文所写技术问答 http developer apple com library mac qa qa1734 index html 默认情况下 一旦您的应用程序创建了 OpenGL 上下文 通过 直接调用OpenGL或依赖OpenGL

随机推荐