gpt4 book ai didi

iphone - NSValue 到 NSNumber 转换崩溃

转载 作者:行者123 更新时间:2023-11-28 20:29:58 25 4
gpt4 key购买 nike

我想将 NSValue 转换为 NSNumber。这段代码有什么问题?

char value[4];
[myNSValue getValue:(void*)value];
NSNumber *number = [[NSNumber alloc] initWithBytes:(void*)value objCType:[myNSValue objCType]];
NSTimeInterval duration = [number intValue];

它导致最后一行崩溃。这里会发生什么?

最佳答案

正如@ale0xB 在上面的评论中所诊断的那样,NSNumber doesn't actually provide its own implementation-initWithBytes:objCType:方法;所以,当你调用那个选择器时,你实际上得到了来自 NSNumber 的实现。的基类 NSValue . [[NSNumber alloc] initWithBytes:foo objCType:bar] 之间没有1 区别和 [[NSValue alloc] initWithBytes:foo objCType:bar] — 他们都调用相同的方法实现,释放 self它被给出并返回一个新对象,该对象通常是 NSConcreteValue 类型(NSValue 的未记录子类,但不是 NSNumber 的子类)。

更清楚一点:

#import <assert.h>
#import <Foundation/Foundation.h>

int main()
{
id x;

x = [NSNumber numberWithInt:42];
assert( [x isKindOfClass:[NSNumber class]] );
assert( [x respondsToSelector:@selector(intValue)] );

int fortytwo = 42;
x = [[NSNumber alloc] initWithBytes:&fortytwo objCType:@encode(int)];
assert( [x isKindOfClass:[NSValue class]] );
assert( ! [x isKindOfClass:[NSNumber class]] ); // yikes!
assert( ! [x respondsToSelector:@selector(intValue)] ); // your particular problem
}

但是,类别可以拯救! Martin Häcker 写了一个类别 NSNumber(CreatingFromArbitraryTypes)它可以适应做你想做的事。查看公共(public)域源代码 here .2 基本思想是对每种可能的类型编码进行特殊处理:

  • 如果你想编码一个 "i" , 然后发送到 -numberWithInt: ;
  • 如果你想编码一个 "f" , 然后发送到 -numberWithFloat: ;

等等。这很乏味;但是一旦你编写了一次代码,你就可以从那时起使用类别并简单地调用 [NSNumber numberWithValue:myNSValue] .

(1 – 或多或少。我会说,在这种情况下没有什么区别。)

(2 – 该代码有几个错误,尤其是在以后的修订版中。参见 my patch here。)

关于iphone - NSValue 到 NSNumber 转换崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12585542/

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