首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类NSMutableString

子类NSMutableString
EN

Stack Overflow用户
提问于 2011-04-06 19:48:02
回答 2查看 460关注 0票数 0

我知道,当一个人对Obj有疑问时,首先要做的就是阅读苹果的文档。我做到了。我看了“可可基本面指南”第95页-第102页。这就是我所知道的从类集群创建复合对象的方法。

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

所以我运用了我所知道的。这是我的密码。

代码语言:javascript
复制
#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的类推。但是,与使用int、char和其他基本类型相比,NSNumber实际上更有效吗?只是好奇而已。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-06 20:10:14

如果你把失败描述在“它不起作用”之外,那肯定会有帮助。

但是,您的-init方法被注释掉了,因此不可能创建embeddedMutableString。即使取消注释,也可以调用+alloc来创建embeddedMutableString,但从不初始化它。

在查看文献资料之后,似乎子类的-init方法应该如下所示(警告:未经测试的代码):

代码语言:javascript
复制
-(id)init
{
    if (self = [super init]) {
        embeddedMutableString = [[NSMutableString alloc] init];
    }
    return self;
}

当然,您还必须提供一个-dealloc来释放embeddedMutableString并调用[super dealloc]

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-06 20:21:58

要回答您的NSNumber问题,不,NSNumber是比C原语更有效的而不是。NSNumber是C原语的封装,本质上允许将原语插入到NSArray和NSSet这样的对象中。如果您需要这种封装能力,但需要实际的intfloat的速度,那么编写您自己的NSNumber类就足够简单了,该类只适用于一种类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5572132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档