Objective-c中的一种奇怪的类型转换

Tab*_*Tab 3 casting objective-c uikit ios

我发现了一个使用类型转换的演示片段,如下所示:(int)view.'view'是UIView对象的指针.我从来不知道它可以用于铸造类型.有人可以帮我解释一下吗?粘贴代码在这里

- (CGPoint)accelerationForView:(UIView *)view
{
    // return
    CGPoint accelecration;

    // get acceleration
    NSValue *pointValue = [self._accelerationsOfSubViews objectForKey:
                                     [NSNumber numberWithInteger:(int)view]];
    if (pointValue == nil) {
        accelecration = CGPointZero;
    }
    else {
        [pointValue getValue:&accelecration];
    }

    return accelecration;
}

- (void)willRemoveSubview:(UIView *)subview
{
    [self._accelerationsOfSubViews removeObjectForKey:
                         [NSNumber numberWithInt:(int)subview]];
}
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 5

[NSNumber numberWithInteger:(int)view]
Run Code Online (Sandbox Code Playgroud)

view它不是类型的对象UIView,它是类型的指针UIView*.上面的代码将指针强制转换为int,以便将其存储在a中NSNumber,显然它可以用作字典中的键.由于指针本身不是对象,因此不能将它们用作字典键.但是,如果NSNumber从指针创建实例,则可以将生成的对象用作键.人们有时会做这类事情来跟踪他们想要与一些未存储在对象本身中的对象(如视图)相关联的信息(如加速).

正如我在下面的评论中提到的,这里使用的代码+numberWithInteger:很好,因为该方法需要a NSInteger,32位系统为32位,64位系统为64位.然而,作者然后通过强制转换使int该决定无效,即使在64位系统上也是如此.演员应该真的这样NSInteger,像这样:

[NSNumber numberWithInteger:(NSInteger)view]
Run Code Online (Sandbox Code Playgroud)