第三方iOS库中的私有方法

时间:2012-08-24 14:46:49

标签: iphone ios uipopovercontroller private

我想使用iPhone的弹出视图。 我发现第三方库和作者说它的一些方法是使用私有方法。(这会在提交到app store时引起问题)
但我没有看到他的代码中使用私有方法的位置 你能发现它们吗?

[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];
}

3 个答案:

答案 0 :(得分:1)

view不是UIBarButtonItem的公共属性。参考申请正在使用它。

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

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

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

它正在使用performSelector访问视图,并且XCode不够智能,无法提供任何警告,同时以这些方式使用私有属性。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您不应该访问view的{​​{1}}属性。这就是私人电话的地方:

UIBarButtonItem

请参阅the official doc for UIBarButtonItem,它没有公开if(![barButtonItem respondsToSelector:@selector(view)]) { // error return; } UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)]; 属性。

虽然,它不是真正的私人通话,因为view方法是完全合法的,并且不会触发某些警报(例如,如果您使用的方法名称仅用于私人通话),那么Apple不应该注意它。但我只说不应该,而不会