为什么传递unsigned int到performSelector丢失位?

时间:2016-11-09 14:04:33

标签: objective-c

我正在尝试将十六进制值作为unsigned int传递给使用动态链接的方法。我作为参数传递的值以某种方式被破坏。发生了什么事?

- (void)callPerformSelector
{
    NSNumber *argument = [NSNumber numberWithUnsignedInt:(unsigned int)0xFFFFFFFF];
    SEL selector = NSSelectorFromString(@"testPerformSelector:");
    NSLog(@"testPerformSelector object %@", argument);
   [self performSelector:selector withObject:argument];
}

- (void)testPerformSelector:(unsigned int) arg1
{
    NSLog(@"testPerformSelector unsigned int %u", arg1);
    NSLog(@"testPerformSelector hex %X", arg1);
}

输出是:

testPerformSelector object 4294967295
testPerformSelector unsigned int 4294967283
testPerformSelector hex FFFFFFF3

3 个答案:

答案 0 :(得分:5)

因为它应该是:

re.sub('\r+([^\r]+\r+)',r'\1',_str)

- (void)callPerformSelector { NSNumber *argument = @0xFFFFFFFF; SEL selector = @selector(testPerformSelector:); NSLog(@"testPerformSelector object %@", argument); [self performSelector:selector withObject:argument]; } - (void)testPerformSelector:(NSNumber *) arg1 { NSLog(@"testPerformSelector unsigned int %u", arg1.unsignedIntValue); } unsigned int是两件不同的事情

答案 1 :(得分:2)

有一个简单的理由和复杂的原因。

简单的理由:为什么这不起作用performSelectorWithObject目标的第一个参数必须是一个对象。您正在指定函数签名中无符号整数的指针,但在调用它时会传递一个对象(NSNumber)。所以而不是:

- (void)testPerformSelector:(unsigned int) arg1
你应该

- (void)testPerformSelector:(NSNumber *) arg1

然后,您需要使用NSNumber的{​​{1}}来获取对象的unsignedIntValue

复杂的原因更有趣:为什么这几乎可以工作并且看起来像是丢失了一些。 NSNumber是一个包装数值的对象,这与原始数值非常不同。然而,NSNumber是作为标记指针实现的,所以尽管objective-c知道它是一个对象并将其视为一个对象,但NSNumber值的一个子集实现为标记指针,其中实数值被编码为“指针”以及这个事实不是指针see Friday Q&A的底部四位(否则始终为零)中指示的正常指针。

答案 2 :(得分:1)

您只能将对象传递给选择器而不是基本类型,因此选择器应该是:

pua_ranges = ( (0xE000, 0xF8FF), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD) )

def is_pua_codepoint(c):
    return any(a <= c <= b for (a,b) in pua_ranges)

for line in open('test.txt', 'r'):
    if any(is_pua_codepoint(ord(i)) for i in line):
        pass
    else:
        print(line)

更新:正如@ gnasher729指出的那样,数字传递的原因似乎是- (void)testPerformSelector:(NSNumber *) arg1 { NSLog(@"testPerformSelector hex %x", [arg1 unsignedIntValue]); } ,因为它是tagged pointer

相关问题