gpt4 book ai didi

objective-c - 子类化 NSNumber

转载 作者:太空狗 更新时间:2023-10-30 03:56:45 25 4
gpt4 key购买 nike

我想给 NSNumber 类添加一个属性,所以我必须将它子类化。文档指出我必须重写所有 NSValue 原始方法。由于 NSValue 文档没有说明哪些方法是原始方法,我认为这两个可能是用于实例化的原始方法:

– initWithBytes:objCType:  
+ valueWithBytes:objCType:

所以我将我的类(class)设置为:

@interface MultipleNumber : NSNumber {  
NSNumber *_number;
}
@property (nonatomic, getter = isMultiple) BOOL multiple;
@end

@implementation MultipleNumber
@synthesize multiple=_multiple;

-(id)initWithBytes:(const void *)value objCType:(const char *)type {
self = [super init];
if (self) {
_number=[[NSNumber alloc] initWithBytes:value objCType:type];
}
return self;
}

+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type {
return [[[MultipleNumber alloc] initWithBytes:value objCType:type] autorelease];
}

-(void)getValue:(void *)value { [_number getValue:value]; }

-(const char *)objCType { return [_number objCType]; }

@end

但是当我调用 [NSNumber numberWithBool:YES] 时,我仍然得到一个 _NSCFBoolean 类并且没有调用“原始方法”。我怎样才能弄清楚哪些方法被认为是原始的?

最佳答案

您不需要继承 NSNumber 来添加属性。您可以使用 associative reference 更轻松地添加属性.子类化 NSNumber 非常棘手,因为它是一个类集群。


编辑:@Remco 在他对@diablosnuevos 的评论中提出了一个重要观点,我想在回答中指出这一点:

Yes, I finally did make a subclass by trial and error, because the NSNumbers returned are shared instances, so storing a associated reference is also shared. – Remco Poelstra May 16 at 9:09

记住这一点非常重要。 NSNumber 缓存从 -1 到 12 的整数并将它们视为单例。在 OSX 10.7 中,NSNumber 被实现为标记指针(尚未深入了解相关引用的含义)。关键在于,虽然相关引用非常有用,但可能会有一些底层实现细节会让您感到头疼。

这里的更深层次的教训是子类化或扩充NSNumber可能在任何情况下都不是一个好主意。 NSNumber 是一个非常低级的对象。几乎可以肯定的是,构建另一个拥有 NSNumber 的类会更好,就像 NSAttributedString 拥有一个 NSString 而不是扩展 NSString.

我不知道这里要解决的问题的具体细节,但遇到的问题是一个有趣的教训。

关于objective-c - 子类化 NSNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10414718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com