ARC環境下で非公開APIを実行する

Bookmark this on Google Bookmarks
Share on Facebook

ARCがオフの時には警告が出るだけでしたが、ARC環境下ではプロトタイプ宣言していないメソッドを呼ぶとビルド時にエラーになります。
これはカテゴリなりで宣言すればビルドは通ります。
(参考:ビュー (UIView) の階層構造をダンプする非公開の便利メソッド

- (NSString *)recursiveDescription;を実行する場合は以下のように書きます。

ViewController.h
#import <UIKit/UIKit.h>

// UIWebViewの非公開API用
@interface UIWebView (privateAPI)
- (NSString *)recursiveDescription;
@end

// 元のinterface部
@interface ViewController : UIViewController <UIWebViewDelegate>
{
...

------------------------------------------------

ViewController.m
#import "ViewController.h"

- (void)viewDidLoad
{
    [super viewDidLoad];

    // UIWebViewの非公開API recursiveDescription を呼ぶ
    NSLog(@"%@", [self.webView recursiveDescription]);
    ...
}

もっと短くしたい!というせっかちな方は
UIWebViewでデバッグツールを使うエントリでやってましたが、performSelectorを使えばエラーは出ません。

Before :

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // 参考にしたサイトにはこう書いてあった。
  // ARCがONだとエラー
  [NSClassFromString(@"WebView") _enableRemoteInspector];

  ...
}

After :

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // 非公開APIなのでデバッグが終わったらコメントアウトするべし!!
  // performSelectorだとビルドが通る。
  [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];

  ...
}

Masaru の紹介

おもしろげなゲームを作りたいと思いつつ、普通のiOSアプリ作ってます
カテゴリー: Objective-C   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>