3

我发现了一个演示片段,它使用了这样的类型转换:(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]];
}
4

2 回答 2

5
[NSNumber numberWithInteger:(int)view]

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

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

[NSNumber numberWithInteger:(NSInteger)view]
于 2012-12-18T04:00:49.500 回答
1

(注意:这是基于@Caleb 的回答,假设原始代码试图将acceleration值与 UIView 关联)

我会通过一个类别向 UIView 添加一个加速属性,如下所示:

UIView+加速.h:

@interface UIView ( Acceleration )
@property ( nonatomic ) CGPoint acceleration ;
@end

UIView+加速.m

#import <objc/runtime.h>

@implementation UIView ( Acceleration )

const char * kAccelerationKey = "acceleration" ; // should use something with a prefix just in case

-(void)setAcceleration:(CGPoint)acceleration
{
    objc_setAssociatedObject( self, kAccelerationKey, [ NSValue valueWithCGPoint:acceleration ], OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}

-(CGPoint)acceleration
{
    return [ objc_setAssociatedObject( self, kAccelerationKey ) CGPointValue ] ;
}

@end

删除-accelerationForView:and-willRemoveSubview:并使用view.acceleration = <some point>or <some point> = view.acceleration

于 2012-12-18T04:19:01.890 回答