子类化NSMutableString

时间:2011-04-06 19:48:03

标签: objective-c

我知道当Obj-C有问题时要做的第一件事就是阅读Apple文档。 而我做到了。我阅读了“可可基础指南”第95-第102页。所以这就是我对类集群中复合对象创建的了解。

  • 如果需要修改提供的函数,则应该完成类集群的子类化。
  • 复合对象必须覆盖超类的基本方法。 (我还读到,超类的超类的原始方法也必须被覆盖。)

所以我应用了我所知道的。 这是我的代码......

#import <Foundation/Foundation.h>

@interface GOObjectKeyName : NSMutableString
{
    NSMutableString *embeddedNSMutableString;
}

//+ GOObjectKeyName;

//- init;

//From NSString
- (NSUInteger) length;

// From NSString
- (unichar) characterAtIndex: (NSUInteger) index;

// From NSString
- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange;

// From NSMutableString
- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString;

//- (void) dealloc;

@end



#import "GOObjectKeyName.h"

@implementation GOObjectKeyName

/*
+ GOObjectKeyName
{
    return [[[self alloc] init] autorelease];
}

- init
{
    self = [super init];
    if (self)
    {
        embeddedNSMutableString = [[NSMutableString allocWithZone: [self zone]] init];
    }
    return self;
}
*/

- (NSUInteger) length
{
    return [embeddedNSMutableString length];
}

- (unichar) characterAtIndex: (NSUInteger) index
{
    return [embeddedNSMutableString characterAtIndex: index];
}

- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange
{
    [embeddedNSMutableString getCharacters: buffer range: aRange];
}


- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString
{
    [embeddedNSMutableString replaceCharactersInRange: aRange withString: aString];
}

/*
- (void) dealloc
{
    [embeddedNSMutableString release];
    [super dealloc];
}
*/

@end

评论的方法被评论,因为我不确定它们是否必要。我只是把它们写下来,因为我在例子中看到了它们。而且你也可能会看到它基本上是另一个NSMutableString类。但是不要担心,它有一个更大的目的,我只是想知道在我继续之前基础是正确的,因为这是我第一次使用复合对象。 如你所知......它不工作! 经过数小时的反复试验,请理解我的沮丧情绪。 如果有人可以在这里指导我,那将是一个很大的安慰。

哦,如果你不介意我还有另外一个小问题。 苹果文档中的示例描述了NSNumber的类比。但是NSNumber实际上比使用int,char和其他基本类型更有效吗? 好奇。

2 个答案:

答案 0 :(得分:1)

如果您将故障描述为“它不起作用”,那肯定会有所帮助。

但是,您的-init方法已被注释掉,因此无法创建embeddedMutableString。即使您取消注释,也可以致电+alloc创建embeddedMutableString,但不会初始化它。

在查看the documentation之后,似乎子类的-init方法看起来像这样(警告:未经测试的代码):

-(id)init
{
    if (self = [super init]) {
        embeddedMutableString = [[NSMutableString alloc] init];
    }
    return self;
}

当然,您还必须提供发布embeddedMutableString并调用[super dealloc]的-dealloc。

就NSNumber而言,不是,它不比像int这样的基本类型更有效,但它确实有其他优点。 NSNumber是一个类,因此您可以将NSNumber的实例存储在Cocoa的集合类中,例如NSArray和NSSet。您可以将它们写入属性列表。 NSDecimalNumber避免了十进制和二进制表示法之间的转换所带来的不精确性。等等...

答案 1 :(得分:0)

要回答您的NSNumber问题,不,NSNumber 比C基元更有效。 NSNumber是C基元的封装,基本上允许将基元插入到NSArray和NSSet等对象中。如果你需要这种封装能力,但想要实际的 int float 的速度,那么编写你自己的类NSNumber类只需要一种类型就足够了。