如果我有类似
的课程@interface myclass:NSString
{
double b;
}
现在如果我想更改myclass的值b和字符串值,我应该如何在alloc init之后继续
答案 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并且不能使用包装器的情况下使用它