2014-09-29 29 views
1

也許這會爲某人節省一小時或幾個調試時間。實現在斯威夫特的XML解析器,類似於Objective-C的,似乎很簡單:Swift內存管理漏洞:邊界情況,功能或錯誤?

private class Customparser : NSObject,NSXMLParser 
{ 
    // ... implement the parser protocol methods 
} 

... 

let parser=NSXMLParser(data:data) 
parser.delegate=CustomParser() 
let success=parser.parse() 

此代碼失敗,真的無益運行時錯誤(壞的訪問)。

回答

0

原來,主要的問題是分配給parser.delegate屬性會立即觸發自動引用計數重新分配,因爲它是'assign'屬性。所以,如果讀者被連接到不同的對象實例,它活得足夠長,以實際執行它的任務:

let reader=CustomParser() 
let parser=NSXMLParser(data:data) 
parser.delegate=reader 
let success=parser.parse() 

在事後很難說,如果這是一個錯誤,因爲它是如何底層Objective-一致C框架的行爲,但對於從Swift開始的人來說,這似乎確實如此。

還有一個問題:將解析器類聲明爲私有不會導致任何編譯器錯誤,但它會帶來運行時崩潰。取出私人修改器可解決問題。這是否意味着私有類的編譯方式意味着它們不能交給其他代碼塊?

+2

我會打開雷達(bugreport.apple.com)關於崩潰。編譯器應該能夠檢測到'parser.delegate = CustomParser()'是無效的(因爲'CustomParser'符合所需協議的事實是私有的,所以'NSXMLParser'不應該可見)。將其固定在編譯器中可能會很困難,但這是一個合理的要求。至於內存管理,這是你的錯誤(你永遠不會擁有強大的參考),但是期望靜態分析器能夠檢測到這種錯誤是合理的。雷達可能是合理的。 – 2014-09-29 12:37:15