为什么iOS头文件中列出了私有?属性?

时间:2013-06-26 15:56:32

标签: ios header private

我正在研究如何使用iOS6中的UIPanGestureRecognizer执行某些操作,并查看了头文件UIPanGestureRecognizer.h的一部分:

NS_CLASS_AVAILABLE_IOS(3_2) @interface UIPanGestureRecognizer : UIGestureRecognizer {
    @package
    CGPoint         _firstScreenLocation;
    CGPoint         _lastScreenLocation;
    NSTimeInterval  _lastTouchTime;
    id              _velocitySample;
    id              _previousVelocitySample;
    NSMutableArray  *_touches;
    NSUInteger      _lastTouchCount;
    NSUInteger      _minimumNumberOfTouches;
    NSUInteger      _maximumNumberOfTouches;
    CGFloat         _hysteresis;
    CGPoint         _lastUnadjustedScreenLocation;
    unsigned int    _failsPastMaxTouches:1;
    unsigned int    _canPanHorizontally:1;
    unsigned int    _canPanVertically:1;
    unsigned int    _ignoresStationaryTouches:1;
}

@property (nonatomic)          NSUInteger minimumNumberOfTouches;   // default is 1. the minimum number of touches required to match
@property (nonatomic)          NSUInteger maximumNumberOfTouches;   // default is UINT_MAX. the maximum number of touches that can be down

- (CGPoint)translationInView:(UIView *)view;                        // translation in the coordinate system of the specified view
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view;

- (CGPoint)velocityInView:(UIView *)view;                           // velocity of the pan in pixels/second in the coordinate system of the specified view

@end

我正在考虑用

做点什么
CGPoint         _firstScreenLocation;

这不是@property所以它是私有的。

我的问题是:为什么我们能够看到这些私人物品?如果它们是“私人的”,它们如何被使用?

我想也许是因为我们想要对该对象进行子类化,所以我尝试按如下方式进行:

#import <UIKit/UIGestureRecognizerSubclass.h>

@interface MyPanGesture : UIPanGestureRecognizer

- (CGPoint) firstLocation;

@end

@implementation MyPanGesture

- (CGPoint) firstLocation
{
    return self->_firstScreenLocation;
}

@end

但这无法构建链接错误:

架构armv7s的未定义符号:   “_OBJC_IVAR _ $ _ UIPanGestureRecognizer._firstScreenLocation”,引自:        - Gesture.o中的[MyPanGesture firstLocation] ld:找不到架构armv7s的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

任何人都可以帮助这个迷茫的人吗?

2 个答案:

答案 0 :(得分:1)

看看@package。 该指令意味着只有属于同一图像的类才能访问该变量;这意味着只有UIKit的类才能访问_firstScreenLocation。

答案 1 :(得分:0)

它完全失败的原因是你说的,它是私人(实际上是,这是微妙的不同,但它是私人的)。您可以看到它们,因为那些实例变量正在暴露给它自己的的其余部分。该套餐为UIKit

你无法得到它。

(旁白:公共/私人状态与 ivar 属性无关)

你应该设置一个gesture recognizer delegate,它会在平移发生时调用方法。

UIPanGestureRecognizer

  

此类的客户端可以在其操作方法中查询UIPanGestureRecognizer对象,以获取当前手势转换(translationInView :)和转换速度(velocityInView :)。他们可以指定其坐标系应用于平移和速度值的视图。客户还可以将翻译重置为所需的值。