0

我想为 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];
}
4

3 回答 3

1

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

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

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

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

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

于 2012-08-24T15:05:46.407 回答
0

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

于 2012-08-24T14:53:27.897 回答
0

您不应该访问viewa 的属性UIBarButtonItem。那就是私人电话的地方:

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

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

请参阅官方文档UIBarButtonItem,它没有公共view财产。

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

于 2012-08-24T14:59:02.453 回答