我正在尝试将十六进制值作为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
答案 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。