【问题标题】:Subclassing NSString子类化 NSString
【发布时间】:2011-08-01 06:49:19
【问题描述】:

使用 WSDL2ObjC 我得到了很多 NSString 子类的类。 我发现初始化这些类的任何对象的 NSString 值很麻烦。

假设我的班级看起来像这样:

@interface mClass ; NSString {
     int value;
}

现在在我的代码中,我想使用 mClass 的对象作为 NSString 并且还想使用它的属性值,它是一个整数。

我该怎么做?

我正在尝试使用这样的代码

 mClass *obj = [[mClass alloc] initWithString:@"Hello"];

但它向我显示一个错误,说我正在使用类的抽象对象,我应该改用具体实例。

【问题讨论】:

标签: nsstring


【解决方案1】:

如果你真的需要创建 NSString 子类,你应该重写 3 个方法:

- (instancetype)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length freeWhenDone:(BOOL)freeBuffer;
- (NSUInteger)length;
- (unichar)characterAtIndex:(NSUInteger)index;

例如:

MyString.h

@interface MyString : NSString 

@property (nonatomic, strong) id myProperty;

@end


MyString.m

@interface MyString ()

@property (nonatomic, strong) NSString *stringHolder;

@end

@implemenation MyString

- (instancetype)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length freeWhenDone:(BOOL)freeBuffer {
    self = [super init];
    if (self) {
        self.stringHolder = [[NSString alloc] initWithCharactersNoCopy:characters length:length freeWhenDone:freeBuffer];
    }
    return self;
}

- (NSUInteger)length {
    return self.stringHolder.length;
}

- (unichar)characterAtIndex:(NSUInteger)index {
    return [self.stringHolder characterAtIndex:index];
}

@end

【讨论】:

    【解决方案2】:

    使用内部使用 NSStrings 来执行您尝试执行的任何操作或操作的包装类可能更聪明。然而,这将导致您需要重载您想要的任何 NSString 功能(例如获取字符串的长度)。

    或者,您可以创建一个 NSString 类别(位于新文件窗口中的 Objective-C 类旁边)。这允许您添加任何您希望“添加”到 NSString 类的属性或方法。现在只需将此类别导入您希望使用的任何位置,您将可以在任何 NSStrings 对象上使用所有自定义函数。

    【讨论】:

      【解决方案3】:

      真的需要继承NSString吗?这是一个class cluster,这(除了其他东西)意味着它很难子类化。 Mike Ash 在subclassing class clusters 上有一个很好的帖子。如果您不知道存在类集群,那么您可能是 Cocoa 的新手,在这种情况下,最好的简短答案是不要尝试对类集群进行子类化

      在 Stack Overflow 上还有关于 NSString 子类化的 previous questions。下次你可能想在提出新问题之前先搜索一下。

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多