Iphone NSValue到NSNumber的转换崩溃

Iphone NSValue到NSNumber的转换崩溃,iphone,objective-c,ios,nsnumber,nsvalue,Iphone,Objective C,Ios,Nsnumber,Nsvalue,我想将NSValue转换为NSNumber。这个代码有什么问题 char value[4]; [myNSValue getValue:(void*)value]; NSNumber *number = [[NSNumber alloc] initWithBytes:(void*)value objCType:[myNSValue objCType]]; NSTimeInterval duration = [number intValue]; 它会导致最后一行的崩溃。这里会发生什么?请阅读我上面

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

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

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

请阅读我上面的评论以获得进一步解释

要实现您想要的,只需使用(char*)初始化NSString,然后调用NSString的intValue。-假设您知道类型,如果不知道,请查看下面的注释-


干杯

请阅读我上面的评论以了解进一步的解释

要实现您想要的,只需使用(char*)初始化NSString,然后调用NSString的intValue。-假设您知道类型,如果不知道,请查看下面的注释-


欢呼

正如上面评论中诊断的@ale0xB,
-initWithBytes:objCType:
方法的
NSNumber
;因此,当您调用该选择器时,实际上得到的实现来自
NSNumber
的基类
NSValue
[[NSNumber alloc]initWithBytes:foo objCType:bar]
[[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
}
导入。2基本思想是对每种可能的类型编码进行特殊处理:

  • 如果您试图编码一个
    “i”
    ,请发送至
    -numberwhithint:
  • 如果您试图编码一个
    “f”
    ,则发送到
    -numberWithFloat:
诸如此类。这很乏味;但一旦您编写了一次代码,您就可以从那时起使用该类别,只需调用
[NSNumber numberWithValue:myNSValue]

(1–或多或少。我认为,在这种情况下没有显著差异。)


(2–该代码有几个bug,特别是在以后的版本中。请参阅。)正如上面评论中诊断的@ale0xB一样,
-initWithBytes:objCType:
方法的
NSNumber
;因此,当您调用该选择器时,您实际上得到的实现来自
NSNumber
的基类
NSValue
[[NSNumber alloc]之间没有1个区别initWithBytes:foo objCType:bar]
[[NSValue alloc]initWithBytes:foo objCType:bar]
-它们都调用相同的方法实现,释放给定的
自我
,并返回一个新对象,该对象的类型通常为
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
}
导入。2基本思想是对每种可能的类型编码进行特殊处理:

  • 如果您试图编码一个
    “i”
    ,请发送至
    -numberwhithint:
  • 如果您试图编码一个
    “f”
    ,则发送到
    -numberWithFloat:
诸如此类。这很乏味;但一旦您编写了一次代码,您就可以从那时起使用该类别,只需调用
[NSNumber numberWithValue:myNSValue]

(1–或多或少。我认为,在这种情况下没有显著差异。)


(2–该代码有几个bug,尤其是在以后的修订版中。请参阅。)

您想实现什么?NSNumber不应该这样使用。我想从NSValue中获取值,并将其存储在NSNumber中以便于传递。NSNmber是否有不同的objCType参数[NSValue objCType]返回?您是否试图将char[4]转换为int?如果我错了,请纠正我,但
value
不是指针吗?然后,您在第四行尝试将指针转换为int。当您使用initWithBytes初始化NSNumber时,实际上是在调用NSValue(NSNumber的父类)initialiser,它返回一个NSValue,因此它不会响应intValue,因为它没有实现它。您想实现什么?NSNumber不应该这样使用。我想从NSValue获取值并将其存储在NSNumber中以便轻松传递。NSNmber是否有不同的objCType参数,然后[NSValue objCType]返回?您是否试图将char[4]转换为int?如果我错了,请纠正我,但
value
不是指针吗?然后,您在第四行尝试将指针转换为int。当您使用initWithBytes初始化NSNumber时,实际上是在调用NSValue(NSNumber的父类)initialiser,它返回一个NSValue,因此它不会响应intValue,因为它没有实现它。为了正确性,对上面的评论投了赞成票,但对这个答案投了反对票,因为“init an NSString with your(char*)”肯定不是OP想要的。假设原始
myNSValue
包含整数55。然后
char value[4]
将包含
“\x37\0\0\0”
,并且
[[NSString stringWithUTF8String:value]intValue]
将是7,而不是55。嗨,这不是stringWithUTF8String的正常用法。默认情况下,它已经支持UTF-8,这意味着您可以执行
[NSString stringWithUTF8String:“Hello\u0100!”]
但不支持
[NSString stringWithUTF8String:“Hello\u0099!”]
->这甚至不会编译。为转换创建字符串缓冲区是许多其他语言(如Java)中广泛使用的技术这也可以安全地应用于Obj-C。请重新考虑你的否决票,干杯。这里的问题不是
stringWithUTF8String
;而是你对
-[NSValue getValue:value]
的理解。你知道
-[NSValue getValue:value]
之后
value
的内容是
“\x37\0\0\0”
而非
“55”
?(以及您对
“\u0099”