我知道当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和其他基本类型更有效吗? 好奇。
答案 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类只需要一种类型就足够了。