私はいくつかの複雑なブロックコードを手に入れていたので、次のコードが正しく動作することを期待していなかったので、私は尋ねています。 プリミティブプロパティにはどのようなデータ型がありますか?
はように、我々はBOOLプロパティを持っていると言う:@property (nonatomic, assign) BOOL isCancelled;
それの自動合成し、無カスタムゲッター、セッターがない、明示的なIVAR。
その後、完全に
dispatch_async(queue, ^{
id result = block(&_isCancelled);
if (!_isCancelled) { ... }
}
しかし、私はそれがブロック()の呼び出しのためではなく、私はそれをキャプチャするだろうと思ったところ、場合のために働くと予想しているだろうに動作し、このコードは...あります_isCancelledの値をconstにしておき、実行中に突然変異させることはありません。それでも、実行時に、_isCancelledの値は、実際にBOOLであるかのように、ブロックの内側/外側で常に一貫しています。*
誰でも何が起こっているのか説明できますか?
実際には、指定されたコードではプロパティが使用されません。暗黙的に宣言されていますが、 '_isCancelled'は通常の* ivar *です。 – Sulthan
合意されていますが、明示的に宣言されていないため、プリミティブではなくポインタとして宣言することができます。これは行動を説明することができます(私が何かを逃していない限り) – CatalinM
プロパティのタイプは、裏地ivarのタイプと同じです。宣言プロパティ 'BOOL isCancelled'は、' BOOL _isCancelled'のivarが合成されることを意味します。それで全部です。 – Sulthan