Hessian服務器的OC部分代碼框架采用的是http接口和NSConnection來做數據請求,在2017年蘋果要求的https請求上,是無法做到數據請求的,只能走http;
但是需要實現https怎么辦呢,我想起以前的NSConnection做https就是加一個對證書里面的默認允許的方法,但是他總是不走這個方法去實現,我在框架包里面找到了這個文件:
CWDistantHessianObject+Private文件
的這個方法:-(NSData)sendRequestWithPostData:(NSData)postData;
這個方法,是該框架http請求數據的核心方法,但是里面的實現是使用的NSConnection的,我想要添加那個方法,不能被調用
所以我寫了一個DJConnection繼承自NSConnection的,來實現,但是依然不行
怎么辦呢!
我找到了NSURLConnectionDataDelegate,對他做了繼承并封裝了他的
didReceiveAuthenticationChallenge
canAuthenticateAgainstProtectionSpace
didReceiveData
connectionDidFinishLoading
這4個方法,讓CWDistantHessianObject+Private文件
的這個方法:-(NSData)sendRequestWithPostData:(NSData)postData;
里面的DJConnectionDelegate *obj = [[DJConnectionDelegate alloc]init];
[[NSURLConnection alloc] initWithRequest:request delegate:obj];
使用我的delegate就可以了
當然了,在這里獲取參數成功時,心情很激動,昨天晚上的班沒有白加,但是這是在斷點打著的情況下,我做到了通過https把數據獲取成功,但是還是遇到了一個崩潰
我打了全局斷點還是沒有任何提示 只是在打印中出現了:
-[OS_dispatch_data release]: message sent to deallocated instance 0x6080000b8ba0
Message from debugger: Terminated due to signal 9
是紅色的 EXC_BAD_ACCESS問題
查資料發現,叫做使用了已經被提前釋放的對象的方法
我找了下我自己寫的代碼,發現那個data我是在最后才做的釋放,不可能提前釋放了,而我屬于長期使用ARC的新人開發者,并沒有怎么使用過MRC,用熟話說叫做:用MRC就是作,NO作NO DIE,但是我不信,我就是去改了這個東西了,我對比了原方法(做http部分代碼)發現他在做else if (returnResponse != nil) {
if ([returnResponse statusCode] == 200) {
[responseData retain];
}
的時候,對獲取到的responseData做了retain引用計數+1,而我的并沒有做這個事情,而且紅色崩潰也是在我做return responseData ? [responseData autorelease] : nil;之后,所以我把這句代碼加上去了
文章為本人原創,轉載請說明出處
文中不足之處,敬請斧正,也希望依然在使用Hessian來做服務器的iOS同行能多多交流,后續本人可能會對Hessian原框架部分代碼進行版本升級,使用NSSession來做數據請求。
****************************************Perfect*****************************************
查看資料:
附帶iOS內存調試講解:http://www.cnblogs.com/ljios/p/5088947.html