创建和使用虚拟NSData的子类不起作用

我有创造我自己的子类问题NSData ,我想有一个自定义description方法。 甚至创建一个虚拟NSData子类:

@interface MyData : NSData {} @end

@implementation MyData @end

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

  • 是什么的指定初始化NSData
  • 什么是最低限度的,我需要写的一个虚拟子类NSData

--------------解决方案-------------

一种制造NSData子类是困难的,因为(如drewag说明)是一类集群的一个成员。 从二进制数据编程指南:

...数据对象不是NSData的或NSMutableData类的实际情况,而是有自己的私人的一个子类的实例。

当你做[[NSData alloc] initWith...]你没有得到回一个NSData ; 你可能会得到回一个NSConcreteData 。 非凡可可的爱情有子类类簇的讨论和论证。

最好的(也是最惯用语)的选择可能是组成:您的自定义类应该只包含一个NSData伊娃,并实施了封闭的对象上运行的描述方法。

虽然drewag的回应是技术上是正确的,这是可可类使用一个危险的技术; 它将覆盖description 每一个方法NSData对象在节目中,您无论是直接还是不会创建它。

在具体情况下description方法,这可能是好的,但对另一种方法更容易在框架内与其他物体依靠的,它可能会导致大的,难以跟踪的问题。 如果你确信没有其他办法时,才应这样做。

这将是更好的创建一个带有前缀的类和方法:

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

苹果文档具体提及这一类重写的技术,建议反对:

因为在一个类别中声明的方法将被添加到现有的类,你必须非常小心,方法名。

如果在一个类别中声明的方法的名称是一样的,在原始类的方法,或在同一类其他类别的方法(甚至一个超类),以在使用该方法的实施行为是不确定运行时。

该文档的早期版本接着说:

一些类方法的存在很可能会导致在所有框架行为的变化。 例如,如果你重写windowWillClose:委托方法在一类NSObject在你的程序,然后使用类中的方法应对所有窗口的代表 ; 您的所有实例的行为NSWindow可能会改变。 你在一个框架类添加分类可能会导致行为的变化神秘而导致崩溃。 [重点煤矿。]

如果你想要的是覆盖一个单一功能的“说明”考虑使用“类别”来代替:

@interface NSData (MyData)
-(NSString*)description;
@end

@implimentation NSData (MyData)
-(NSString*)description
{
return @"something";
}
@end

然后,你可以的NSData的任何实例使用此功能。

它是非常困难的子类NSData的,因为它是一个“类群集”。 公共API把它当作一个类,但在现实中却是隐藏的子类的集合。 你可以研究覆盖类集群,但几乎不再需要它。 另一种选择是创建的NSData你的“MyData的”类作为一个成员变量,而不是使用一个子类。

分类:目标C 时间:2012-08-10 人气:0
本文关键词: 目标C,可可,NSData的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.449 (s). 10 q(s)