[英]private method in 3rd party iOS library
我想為iPhone使用彈出視圖。 我發現了一個第三方圖書館,作者說它的某些方法是利用私有方法(這會在提交到應用商店時引起問題)
但是我看不出他的代碼在哪里使用私有方法。
你能發現他們嗎?
[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];
}
視圖不是UIBarButtonItem的公共屬性。 參考應用程序正在使用它。
要驗證任何此類功能,最好使用點運算符或使用其吸氣劑(相同)來調用其屬性。
檢查以下代碼,表明它是私有的:
UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
它正在使用performSelector訪問視圖,並且XCode不夠聰明,無法發出任何警告,同時以這種方式使用私有屬性。
根據我的經驗,當您上傳圖像時,Apple會對您的二進制文件執行一些自動檢查。 那么,為什么不嘗試上傳卻看看他們是否抱怨呢? 我被一個包含的庫使用了自己的類中的一種方法,該方法與Apple類中的一些私有方法同名,而我的應用卻因此而未能通過(因為我只是重命名了該方法,因為我有來源。)
您不應該訪問UIBarButtonItem
的view
屬性。 那是私人電話的地方:
if(![barButtonItem respondsToSelector:@selector(view)]) {
// error
return;
}
UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
請參閱UIBarButtonItem
的官方文檔 ,它沒有公共view
屬性。
但是,它並不是真正的私有調用,因為view
方法完全合法,並且不會觸發警報(例如,如果您使用的方法名稱僅由私有調用使用),因此Apple不會注意到它。 但是我只說不應 , 不會 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.