繁体   English   中英

在 Objective-C 中继承 NSString

[英]Subclassing NSString in Objective-C

如果我有一个像

@interface myclass:NSString
   {
       double b;
   }

现在,如果我想同时更改 myclass 的值 b 和字符串值,在 alloc init 之后我应该如何进行?

请注意,继承 NSString 不是一个好主意。

NSString 实际上并不是这样一个简单的类。 并且不应在没有充分理由的情况下对其进行子类化。

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

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

NSString 类参考中有一个关于子类化 NSStrings 的很好的说明:

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

确保子类化 NSString 的原因是有效的。 子类的实例应该代表一个字符串而不是其他东西。 因此,子类应该具有的唯一属性是它管理的字符缓冲区的长度以及对缓冲区中单个字符的访问。 创建 NSString 子类的有效原因包括提供不同的后备存储(可能是为了更好的性能)或以不同方式实现对象行为的某些方面,例如内存管理。 如果您的目的是向 NSString 的子类添加非必要属性或元数据,则更好的替代方法是对象组合(请参阅“子类化的替代方法”)。 Cocoa 已经通过 NSAttributedString 类提供了一个示例。

在类参考的底部还有另一部分关于 NSString 子类化替代方案。

您需要将新的 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;

编辑以上不起作用! 请参阅雅各布关于原因的回答......

作为安慰奖,这里有一个包装类,它会给你一个 String & Double

@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

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

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

附注。 仅在需要继承 NSString 并且不能使用包装器的情况下使用它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM