gpt4 book ai didi

objective-c - 创建和使用虚拟 NSData 子类不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:55 25 4
gpt4 key购买 nike

我在创建自己的 NSData 子类时遇到问题,我希望它有一个自定义的 description 方法。甚至创建一个虚拟的 NSData 子类:

@interface MyData : NSData {}
@end

@implementation MyData
@end

并且使用它会导致奇怪的错误(使用它的函数永远不会退出,并且控制以某种方式返回到运行循环)。我想也许我负责重写 NSData 的指定初始化器(调用 super 实现),但文档中没有提到。所以:

  • NSData 的指定初始化器是什么?
  • 我需要为 NSData 的虚拟子类编写的最低限度是多少?

最佳答案

创建 NSData 子类很困难,因为(如 drewag noted )它是 class cluster 的成员.来自Binary Data Programming Guide :

...data objects are not actual instances of the NSData or NSMutableData classes but instead are instances of one of their private subclasses.

当您执行 [[NSData alloc] initWith...] 时,您不会返回 NSData;你可能会得到一个 NSConcreteData。非凡的 Cocoa With Love 有一个 discussion and demonstration子类集群。

最好的(也是最惯用的)选项可能是 composition : 您的自定义类应该只包含一个 NSData ivar,并实现一个对该封闭对象进行操作的描述方法。

虽然 drewag 的回答在技术上是正确的,但在 Cocoa 类上使用这种技术是危险的;它将覆盖程序中每个 NSData 对象的description 方法,无论您是否直接创建它。

description 方法的特定情况下,这可能没问题,但对于框架中其他对象更可能依赖的另一种方法,它可能会导致难以追踪的大问题。仅当您确定没有其他方法时才应这样做。

创建带有前缀的类别和方法会更好:

@interface NSData (FX_Description) 
- (NSString *)FX_description;
@end

Apple 文档 specifically mention这种类别覆盖技术并反对它:

Because the methods declared in a category are added to an existing class, you need to be very careful about method names.

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.

文档的早期版本继续说:

The very presence of some category methods may cause behavior changes across all frameworks. For example, if you override the windowWillClose: delegate method in a category on NSObject, all window delegates in your program then respond using the category method; the behavior of all your instances of NSWindow may change. Categories you add on a framework class may cause mysterious changes in behavior and lead to crashes. [Emphasis mine.]

关于objective-c - 创建和使用虚拟 NSData 子类不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com