在Objective C中对NSString进行子类化

时间:2011-08-01 06:15:59

标签: iphone objective-c

如果我有类似

的课程
@interface myclass:NSString
   {
       double b;
   }

现在如果我想更改myclass的值b和字符串值,我应该如何在alloc init之后继续

4 个答案:

答案 0 :(得分:7)

注意,子类NSString不是一个好主意。

NSString实际上并不是一个简单的类。如果没有充分的理由,它就不应该是子类。

对于NSString,通过Categories或对象组合添加方法要好得多。

但请注意,不允许在类别中添加ivar。 但是,您可以添加属性,并使用Objective-C 2.0中的associative references来访问此私有数据。

关于在NSString class reference中对NSStrings进行子类化的一个很好的说明:

  

可以继承NSString(和NSMutableString),但这样做   所以需要为字符串提供存储设施(不是   由子类继承)并实现两个原始方法。该   abstract NSString和NSMutableString类是公共接口   一个类集群,主要由私有的,具体的类组成   创建并返回适合给定情况的字符串对象。   制作这个集群的自己的具体子类强加了某些   要求(在“覆盖方法”中讨论)。

     

确保您继承NSString的原因是有效的。实例   您的子类应该表示字符串而不是其他内容。   因此,子类应该具有的唯一属性是长度   它管理和访问单个字符的字符缓冲区   在缓冲区。制作NSString子类的有效理由包括   提供不同的后备存储(可能为了更好的性能)   或以不同方式实现对象行为的某些方面,例如   内存管理。如果您的目的是添加非必要属性   或NSRtring子类的元数据,一个更好的选择   是对象组合(参见“子类化的替代”)。可可   已经使用NSAttributedString类提供了一个示例。

在类引用的底部还有另一个关于NSString子类化替代的部分。

答案 1 :(得分:1)

您需要将新的double公开为属性,如下所示:

@interface MyClass : NSString
{
    double b;
}

@property double b;

@end

然后在.m文件中:

@implementation MyClass

@synthesize b;

@end

然后在创建实例时,可以访问double属性:

MyClass* myClassInstance = [[MyClass alloc] init];
myClassInstance.b = 1.2;

编辑以上操作无效!请参阅Jacob关于为什么......

的答案

作为安慰奖,这是一个包装类,它将为您提供一个字符串&双

@interface MyString : NSObject

@property (nonatomic, retain) NSString* string;
@property double b;

- (id)initWithString:(NSString *)aString andDouble:(double)aDouble;

@end

和实施

@implementation MyString

@synthesize string, b;

- (id)initWithString:(NSString *)aString andDouble:(double)aDouble
{
    self = [super init];
    if (self) {
        self.string = aString;
        self.b = aDouble;
    }

    return self;
}

- (void)dealloc
{
    [string release];
    [super dealloc];
}

@end

答案 2 :(得分:1)

Jacob Gorban的回答是正确的:你可能不需要对字符串进行子类化。在存储额外数据方面,您可以考虑使用objc_setAssociatedObject

答案 3 :(得分:0)

你可以在这里看到我的NSString子类化示例:https://stackoverflow.com/a/21331422/1891772

PS。仅在需要子类化NSString并且不能使用包装器的情况下使用它