2014-10-28 151 views
0

這讓我感到困惑。我在NSURLConnection上吸引了類方法,沒有任何問題,但我堅持使用+[NSURLSession sessionWithConfiguration:delegate:delegateQueue:]可以hook + [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]但調用%orig給出「無法識別的選擇器」

我甚至嘗試記錄所有類方法class_copyMethodList (object_getClass([NSURLSession class]), &count);和類方法是居然還有: sessionWithConfiguration:delegate:delegateQueue: initialize

而且奇怪的是鉤不會被調用,所以我認爲我們得到了它的權利。調用%orig(),只是傳遞參數下收益率:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSURLSession sessionWithConfiguration:delegate:delegateQueue:]: unrecognized selector sent to class 0x1919932b8'

這裏的鉤:

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration 
            delegate:(id<NSURLSessionDelegate>)delegate 
          delegateQueue:(NSOperationQueue *)queue 
{ 

    NSURLSession *origResult = %orig(configuration, delegate, queue); 

    return origResult; 
} 

我錯過了什麼?

設置細節: rpetrich's Theos 的Mac OS X 10.9.5 產品iPad Air 1 的iOS 7.1.2

回答

0

這裏的問題與NSURLSession being a class cluster有關。雖然OP中的代碼成功地將類方法掛鉤,但%orig需要調用真實的類名。所以爲了使它工作,這個鉤子必須放在%hook __NSCFURLSession之下。真實的課程名稱可能會因您的情況而有所不同。

0

試試這個代碼...

+ (NSURLSession *) sessionWithConfiguration: (NSURLSessionConfiguration *) configuration delegate: (id) delegate delegateQueue: (NSOperationQueue *) queue 
{ 
    NSURLSession * session = [ NSURLSession SessionWithConfiguration : Configuraion 
          delegate : self 
         DelegateQueue : nil ]; 
} 

delegateQueue指定NSOperationQueue。如果你的代碼需要delegateQueue而不是零,你應該聲明隊列。

+0

問題: 1.在使用'SessionWithConfiguration'' DelegateQueue'的情況下,它不編譯,因爲這個方法不在任何地方,或者它應該在另一個頭文件中? 2.如果你的意思是'sessionWithConfiguration''delegateQueue'。它會在一個永遠遞歸的調用中結束,因爲它只是自稱。 3. self不能在類方法中使用,只能在實例方法中使用。 – radj 2014-10-28 08:22:46

+0

只需瀏覽此鏈接http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec – vishnu 2014-10-28 09:05:10

相關問題