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に格納する目的で、ポインタをintにキャストしますNSNumber。これは、辞書でキーとして使用できるようにするためです。ポインタ自体はオブジェクトではないため、ディクショナリキーとして使用することはできません。ただしNSNumber、ポインタからのインスタンスを作成する場合は、結果のオブジェクトをキーとして使用できます。人々は時々この種のことをして、オブジェクト自体に保存されていないいくつかのオブジェクト(ビューなど)に関連付けたい情報(加速など)を追跡します。

以下のコメントで述べているように、ここでのコードはを使用します+numberWithInteger:。これは、このメソッドがを使用するためNSInteger、32ビットシステムでは32ビット、64ビットシステムでは64ビットになります。ただし、作成者は、にキャストすることでその適切な決定を無効にしましたint。これは、64ビットシステムでも通常32ビットになります。キャストは、実際にNSIntegerは次のようになります。

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

acceleration(注: これは、元のコードが値を UIView に関連付けようとしていると仮定して、@Caleb の回答に基づいています)

次のように、カテゴリを介して UIView に加速プロパティを追加します。

UIView+acceleration.h:

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

UIView+acceleration.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を削除してor-willRemoveSubview:を使用します。view.acceleration = <some point><some point> = view.acceleration

于 2012-12-18T04:19:01.890 に答える