1

MapBox の Route-Me では、iVar が次のように実装されているのを見てきました。

@implementation RMMapView
{
    BOOL _delegateHasBeforeMapMove;
    BOOL _delegateHasAfterMapMove;
    BOOL _delegateHasBeforeMapZoom;
    BOOL _delegateHasAfterMapZoom;
    BOOL _delegateHasMapViewRegionDidChange;
    BOOL _delegateHasDoubleTapOnMap;
    BOOL _delegateHasSingleTapOnMap;
    BOOL _delegateHasSingleTapTwoFingersOnMap;
    BOOL _delegateHasLongSingleTapOnMap;
    BOOL _delegateHasTapOnAnnotation;
    BOOL _delegateHasDoubleTapOnAnnotation;
    BOOL _delegateHasTapOnLabelForAnnotation;
    BOOL _delegateHasDoubleTapOnLabelForAnnotation;
    BOOL _delegateHasShouldDragMarker;
    BOOL _delegateHasDidDragMarker;
    BOOL _delegateHasDidEndDragMarker;
    BOOL _delegateHasLayerForAnnotation;
    BOOL _delegateHasWillHideLayerForAnnotation;
    BOOL _delegateHasDidHideLayerForAnnotation;

    BOOL _constrainMovement;
    RMProjectedRect _constrainingProjectedBounds;

    float _lastZoom;
    CGPoint _lastContentOffset, _accumulatedDelta;
    BOOL _mapScrollViewIsZooming;
}

つまり、.h ファイルではなく .m ファイルで宣言されています。この RMMapView をサブクラス化すると、これらの iVar は表示されません。世界ではなくサブクラスで見えるようにする方法はありますか?

元のコードを保持することが私の意図であるため、サブクラス化してそこから動作を変更することにしました。しかし、おそらくファイルを直接変更し、git を介してメイン リポジトリからコードを更新する方が良い方法でしょうか?

4

2 に答える 2

1

Objective-C では (他の OO 言語と同様)、ほとんどの開発者はインスタンス変数を定義クラスの実装の詳細と見なします。他のクラスから直接アクセスしないでください。

この場合、インスタンス変数は実装で宣言されています。これは、作成者RMMapViewが変数を外部コードに公開したくないという強いヒントです。

于 2012-05-23T09:55:50.340 に答える
0

インスタンス変数をサブクラスから見えるようにしたい場合は、@interfaceではなくで宣言する必要があります@implementation

@interface RMMapView : NSObject
{
@protected
    BOOL _delegateHasBeforeMapMove;
    BOOL _delegateHasAfterMapMove;
    BOOL _delegateHasBeforeMapZoom;
    BOOL _delegateHasAfterMapZoom;
    BOOL _delegateHasMapViewRegionDidChange;
    BOOL _delegateHasDoubleTapOnMap;
    BOOL _delegateHasSingleTapOnMap;
    BOOL _delegateHasSingleTapTwoFingersOnMap;
    BOOL _delegateHasLongSingleTapOnMap;
    BOOL _delegateHasTapOnAnnotation;
    BOOL _delegateHasDoubleTapOnAnnotation;
    BOOL _delegateHasTapOnLabelForAnnotation;
    BOOL _delegateHasDoubleTapOnLabelForAnnotation;
    BOOL _delegateHasShouldDragMarker;
    BOOL _delegateHasDidDragMarker;
    BOOL _delegateHasDidEndDragMarker;
    BOOL _delegateHasLayerForAnnotation;
    BOOL _delegateHasWillHideLayerForAnnotation;
    BOOL _delegateHasDidHideLayerForAnnotation;

    BOOL _constrainMovement;
    RMProjectedRect _constrainingProjectedBounds;

    float _lastZoom;
    CGPoint _lastContentOffset, _accumulatedDelta;
    BOOL _mapScrollViewIsZooming;
}

上部の@protectedは可視性を修飾します。 または にすることもでき@publicます@private@protectedがデフォルトですが、意図的にこれらの ivar をサブクラスから見えるようにしたいことを示すために、明示的に入れたほうがよいでしょう。

于 2012-05-23T10:34:23.573 に答える