Iphone NSValue到NSNumber的转换崩溃
我想将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]; 它会导致最后一行的崩溃。这里会发生什么?请阅读我上面
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”