2013-04-12 115 views
1

我最近將iPhone升級到了iOS 6.1,並且我開發並在iOS 5.0上成功運行的應用程序現在在我釋放EASession對象時崩潰。iOS 6.0上沒有EASession版本問題(iOS 5.0中不存在)

以下錯誤日誌顯示在控制檯:

-[NSRecursiveLock dealloc]: lock (<NSRecursiveLock: 0x1f5afa00> '(null)') deallocated while still in use 
Break on _NSLockError() to debug. 
-[NSRecursiveLock unlock]: message sent to deallocated instance 0x1f5afa00 

的,這是造成問題的代碼行是:

[_session release]; 

什麼是iOS中的兩個版本的變化,這將導致該問題?

非常感謝。

+0

在發佈之前已經關閉了會話嗎?您需要先關閉會話,然後釋放它。 – brianLikeApple

+0

您不能關閉會話對象本身,但您可以關閉連接到會話對象的輸入和輸出流,我已經完成了該操作。 – W0035521

+0

對不起,我正在度假。我所做的是我從不直接調用發佈會。我總是進行關閉會話,這是第一次關閉輸入和輸出,然後釋放會話,如果該會話打開。當你釋放會話,而有輸入和輸出時,你就知道這個問題已經發生。 – brianLikeApple

回答

0
- (void)closeSession{ 

[[_session inputStream] close]; 
[[_session inputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[[_session inputStream] setDelegate:nil]; 
[[_session outputStream] close]; 
[[_session outputStream] removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[[_session outputStream] setDelegate:nil]; 
if (_session){ 
    MCRelease(_session); 
} 
} 

(NSRecursiveLock:0x1f5afa00)釋放,而仍然在使用,當你釋放會話,而有一些輸入和輸出這個問題發生了。

在你的代碼中,不要自己釋放會話,而應該調用closeSession。檢查來自蘋果的EA框架示例。希望這會有所幫助。

+0

當然,你的代碼和我的代碼沒有區別嗎?所有MCRelease(_session)會做的是以我的代碼釋放它的相同方式釋放_session對象? – W0035521

+0

我看過Apple EA代碼,它們的closeSession代碼和我的一樣,實際上這就是我的代碼的起源地。 – W0035521

+0

我的代碼如下: – W0035521