我想向 NSNumber 类添加一个属性,因此我必须对其进行子类化。文档指出我必须重写所有 NSValue 原始方法。由于 NSValue 文档没有说明哪些方法是原始方法,所以我认为这两个可能是实例化的原始方法:
– initWithBytes:objCType:
+ valueWithBytes:objCType:
所以我把我的课程设置为:
@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
为了添加一个属性。您可以使用更轻松地添加属性关联参考 http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html。子类化NSNumber
非常棘手,因为它是一个类簇。
编辑:@Remco 在他对 @diablosnuevos 的评论中提出了一个重要的观点,我想在回答中指出这一点:
是的,我最终通过反复试验做了一个子类,因为返回的 NSNumbers 是共享实例,因此存储关联的引用也是共享的。 – 雷姆科·波尔斯特拉 5 月 16 日 9:09
这是一件非常重要的事情,需要记住。NSNumber
缓存从 -1 到 12 的整数并将它们视为单例。在 OSX 10.7 中,NSNumber
被实现为标记指针(尚未深入研究那里关联引用的含义)。关键是,虽然关联的引用非常有用,但可能存在一些会让您感到烦恼的底层实现细节。
这里更深刻的教训是子类化或增强NSNumber
probably无论如何都不是一个好主意。NSNumber
是一个非常低级的对象。几乎可以肯定的是,建立另一个拥有NSNumber
, 很像NSAttributedString
拥有一个NSString
而不是延伸NSString
.
我不知道这里要解决的问题的具体情况,但遇到的问题是一个有趣的教训。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)