子类化NSString

时间:2011-08-01 06:49:20

标签: nsstring

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

说我的课看起来像这样:

@interface mClass ; NSString {
     int value;
}

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

我该怎么做?

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

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

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

3 个答案:

答案 0 :(得分:6)

如果你真的需要创建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

答案 1 :(得分:0)

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

还有previous questions关于在Stack Overflow上继承NSString的问题。下次您在询问新问题之前可能想要搜索一下。

答案 2 :(得分:0)

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

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