2011-08-01 88 views
3

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

说我的课是这样的:

@interface mClass ; NSString { 
    int value; 
} 

现在在我的代码,我想用mClass的对象既是NSString的,也想使用它的属性值是一个整数。

我该怎么做?

我试图用这样的代码

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

但它显示了我的错误,说我使用的是类的抽象对象,我应该使用的具体实例。

+1

你相同的用户http://stackoverflow.com/users/872255/neel8986?如果没有,你能否简要解释为什么你有相同的IP地址并发布类似的问题? –

回答

0

真的需要子类NSString?这是一个class cluster,除了其他事情以外,这意味着很难进行子类化。 Mike Ash在subclassing class clusters上发表了一篇很好的文章。如果您不知道类集群存在,那么您可能是Cocoa的新手,在这种情况下,最佳答案是,不要尝试将类集群进行子类化。

还有previous questions关于子类化NSString在这里堆栈溢出。下一次你可能想在问一个新问题之前进行一下搜索。

0

使用一个内部使用NSStrings来执行任何操作或操作的包装类可能会更聪明。但是这会导致你需要重载你想要的NSString的任何功能(比如获取字符串的长度)。或者,您可以创建一个NSString类别(在新文件窗口中可以在Objective-C类旁边找到)。这使您可以添加任何您希望“添加”到NSString类的属性或方法。现在只要将这个类别导入到任何你想使用它的地方,你就可以在任何NSStrings对象上使用你所有的自定义函数。

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