【问题标题】:private method in 3rd party iOS library第三方 iOS 库中的私有方法
【发布时间】:2012-08-20 03:39:41
【问题描述】:

我想为 iPhone 使用弹出式视图。 我找到了一个 3rd 方库,作者说它的一些方法正在使用私有方法。(提交到应用商店时会导致问题)
但我看不出他的代码中在哪里使用了私有方法。
你能发现它们吗?

[barButtonItem performSelector:@selector(view)] 被认为是在调用私有方法?

https://github.com/sonsongithub/PopupView/blob/master/SNPopupView%2BUsingPrivateMethod.m

- (void)showFromBarButtonItem:(UIBarButtonItem*)barButtonItem inView:(UIView*)inView animated:(BOOL)animated {

        if(![barButtonItem respondsToSelector:@selector(view)]) {
            // error
            return;
        }

    UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
    UIView *targetSuperview = [targetView superview];

    BOOL isOnNavigationBar = YES;

    if ([targetSuperview isKindOfClass:[UINavigationBar class]]) {
        isOnNavigationBar = YES;
    }
    else if ([targetSuperview isKindOfClass:[UIToolbar class]]) {
        isOnNavigationBar = NO;
    }
    else {
        // error
        return;
    }

    CGRect rect = [targetSuperview convertRect:targetView.frame toView:inView];

    CGPoint p;
    p.x = rect.origin.x + (int)rect.size.width/2;

    if (isOnNavigationBar)
        p.y = rect.origin.y + rect.size.height + BAR_BUTTON_ITEM_UPPER_MARGIN;
    else
        p.y = rect.origin.y - BAR_BUTTON_ITEM_BOTTOM_MARGIN;

    [self showAtPoint:p inView:inView animated:animated];
}

【问题讨论】:

    标签: iphone ios uipopovercontroller private


    【解决方案1】:

    view 不是 UIBarButtonItem 的公共属性。并且参考应用程序正在使用它。

    要验证任何此类功能,最好使用点运算符或使用它的 getter 调用其属性(这是同一件事)。

    检查此代码,表明它是私有的:

    UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
    

    它正在使用 performSelector 访问视图,而 XCode 不够聪明,无法发出任何警告,同时以这些方式使用私有属性。

    【讨论】:

      【解决方案2】:

      您不应该访问UIBarButtonItemview 属性。这就是私人通话的地方:

      if(![barButtonItem respondsToSelector:@selector(view)]) {
          // error
          return;
      }
      
      UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
      

      参见the official doc for UIBarButtonItem,它没有公开的view 属性。

      不过,这并不是真正的私人调用,因为 view 方法是完全合法的,并且不会触发一些警报(例如,如果您使用了仅用于私人调用的方法名称),因此 Apple 不应该注意到它。但我只说不应该,不是不会

      【讨论】:

        【解决方案3】:

        根据我的经验,当您上传图片时,Apple 会对您的二进制文件进行一些自动检查。那么为什么不尝试上传,看看他们是否抱怨呢?我在一个包含的库中使用了他们自己的类上的一个方法,该方法与 Apple 类中的一些私有方法同名,因此我的应用程序没有通过大门(我刚刚重命名了该方法,因为我有来源。)

        【讨论】:

          猜你喜欢
          • 2015-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-04
          • 1970-01-01
          • 2018-01-12
          • 1970-01-01
          相关资源
          最近更新 更多