我知道,当一个人对Obj有疑问时,首先要做的就是阅读苹果的文档。我做到了。我看了“可可基本面指南”第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的类推。但是,与使用int、char和其他基本类型相比,NSNumber实际上更有效吗?只是好奇而已。
发布于 2011-04-06 20:10:14
如果你把失败描述在“它不起作用”之外,那肯定会有帮助。
但是,您的-init方法被注释掉了,因此不可能创建embeddedMutableString。即使取消注释,也可以调用+alloc来创建embeddedMutableString,但从不初始化它。
在查看文献资料之后,似乎子类的-init方法应该如下所示(警告:未经测试的代码):
-(id)init
{
if (self = [super init]) {
embeddedMutableString = [[NSMutableString alloc] init];
}
return self;
}当然,您还必须提供一个-dealloc来释放embeddedMutableString并调用[super dealloc]。
就NSNumber而言,不,它并不比int这样的基本类型更有效,但它确实有其他优势。NSNumber是一个类,因此可以在Cocoa的集合类(如NSArray和NSSet )中存储NSNumber的实例。您可以将它们写入属性列表。NSDecimalNumber避免了由于十进制和二进制符号之间的转换而产生的不精确。等等..。
发布于 2011-04-06 20:21:58
要回答您的NSNumber问题,不,NSNumber是比C原语更有效的而不是。NSNumber是C原语的封装,本质上允许将原语插入到NSArray和NSSet这样的对象中。如果您需要这种封装能力,但需要实际的int或float的速度,那么编写您自己的NSNumber类就足够简单了,该类只适用于一种类型。
https://stackoverflow.com/questions/5572132
复制相似问题