2012-02-13 9 views
4

UIKitフレームワークヘッダーファイルをブラウズしています。匿名の列挙型が定義されていて、一見関連のあるtypedefが続きます。誰かがここで何が起こっているのか説明できますか?iOSフレームワーククラスのCのenum定義

UIViewAutoresizingタイプは、何らかの形で(暗黙のうちに)前のステートメントで宣言された列挙型を参照していますか?その列挙型をどのように参照しますか?

enum { 
    UIViewAutoresizingNone     = 0, 
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
    UIViewAutoresizingFlexibleWidth  = 1 << 1, 
    UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
    UIViewAutoresizingFlexibleTopMargin = 1 << 3, 
    UIViewAutoresizingFlexibleHeight  = 1 << 4, 
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 
}; 
typedef NSUInteger UIViewAutoresizing; 

答えて

3

事がということですビットマスクとして使用することを意図したフラグです。列挙型の問題につながります。それは次のようになりますたとえば、:あなたはUIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeightとビューにsetAutoresizingMask:を呼ぶだろう

typedef enum { 
    UIViewAutoresizingNone     = 0, 
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
    UIViewAutoresizingFlexibleWidth  = 1 << 1, 
    UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
    UIViewAutoresizingFlexibleTopMargin = 1 << 3, 
    UIViewAutoresizingFlexibleHeight  = 1 << 4, 
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 
} UIViewAutoresizing; 
そして、コンパイラが文句を言うと、あなたは明示的 UIViewAutoresizing型に戻ってそれを型キャストしなければなりません。しかしながら、 NSUIntegerはビットマスクをとることができます。

さらに、lef2が言ったことはすべて約NSUIntegerはObjCオブジェクトではないということです。

+0

したがって、匿名列挙型は定数値(#defineに似ています)の記号名のみを宣言しており、typedefは命名規則(UIViewAutoresizing___)のみによって列挙型に関連していますか?私はそれが意味をなさないと思う。 – Keith

+0

@Keith:はい、それは正しい。列挙型に正しい型を渡すコンパイラの施行は、これらのケースでは望ましくなく、直感的ではありません。それが望まれた場合、Appleはtypedefed enumを使用します。 – JustSid

3

私はあなたがここに一つのことだけ間違ったんだと思う:NSUIntegerは、32ビットシステムと64ビットシステム上のunsigned longunsigned intされているオブジェクトObjective-Cのではありません。だから、実際には、これは何が起こっているのである:

以上の基準については
typedef unsigned int UIViewAutoresizing; 

または

typedef unsigned long UIViewAutoresizing; 

私はこれを追加します。

#if __LP64__ || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

出典:CocoaDev

+0

これは非常に役に立ちます。ありがとうございます。 – Keith

+0

Err、その逆です。 32ビットシステムでは 'int '、64ビットシステムでは' long'です。 – JustSid

+0

@JustSidもちろんです。私は私のポストを変更しました。 – v1Axvw