Предположим, что у меня есть два класса, и две функции, как это:АРК Срок службы при доступе к собственности
public class DataContainer {
let someData = NSMutableData()
}
public class SuperContainer {
let someDataContainer = DataContainer()
}
func subFunc(someDataContainer: DataContainer) {
// Is someSuperContainer guaranteed to be alive?
// Or may it have been released and only someDataContainer is still alive,
// because someSuperContainer is not referenced anymore?
... do something with someDataContainer ...
}
func superFunc() {
let someSuperContainer = SuperContainer()
subFunc(someSuperContainer.someDataContainer)
}
гарантируемые ли someSuperContainer
быть живым до subFunc
возвратов или может он стать освобожден после subFunc
был введен, потому что он не ссылается больше?
Edit: Лучше пример (я пытался держать вопрос общий, но теперь я думаю, что лучше включать в реальном мире, как пример):
public class DataContainer {
let someData = NSMutableData()
deinit {
memset_s(someData.mutableBytes, someData.length, 0x00, someData.length)
}
}
func doSomethingWithData(data: NSMutableData) {
// Is DataContainer guaranteed to be still alive?
// Or may it have been released and `data` zeroed-out,
// because someSuperContainer is not referenced anymore
// (and was deinitialized and released)?
... do something with data ...
}
func someFunc() {
let dataContainer = DataContainer()
doSomethingWithData(dataContainer.someData)
}
Этот пример, подобный «реальному миру», иллюстрирует, почему этот шаблон проблематичен. Вы выделили свой «DataContainer», который, в свою очередь, присвоил «NSMutableData», передал его «doSomethingWithData», а затем «DataContainer» выпал из области действия и был освобожден, вызывая его 'deinit', тогда как' doSomethingWithData' может быть используя данные асинхронно. – Rob