2016-03-13 2 views
1

Предположим, что у меня есть два класса, и две функции, как это:АРК Срок службы при доступе к собственности

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) 
} 
+1

Этот пример, подобный «реальному миру», иллюстрирует, почему этот шаблон проблематичен. Вы выделили свой «DataContainer», который, в свою очередь, присвоил «NSMutableData», передал его «doSomethingWithData», а затем «DataContainer» выпал из области действия и был освобожден, вызывая его 'deinit', тогда как' doSomethingWithData' может быть используя данные асинхронно. – Rob

ответ

2

Любая переменная или класс доступен и живой до тех пор, пока его объем не закончится. В вашем случае у someSuperContainer есть область superFunc. Когда superFunc заканчивается, тогда будет и некоторыйSuperContainer.

func superFunc() { 
    let someSuperContainer = SuperContainer() 
    subFunc(someSuperContainer.someDataContainer) 
    // someSuperContainer will cease to exist once this func completes. 
} 
+0

Спасибо Кстати, у вас есть официальный источник? –

+1

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html – ryantxr

+1

Незначительное разъяснение: Технически, в ARC объект освобождается, когда нет более сильных ссылок на него. В этом случае нет других сильных ссылок на него, и когда он выходит из сферы действия, последняя сильная ссылка удаляется и поэтому будет освобождена. Но если 'subFunc' был реорганизован, чтобы взять супер-контейнер в качестве параметра и поддерживал сильную ссылку на него до тех пор, пока запрос не будет выполнен, он не будет освобожден до тех пор, пока последняя сильная ссылка не будет решена. – Rob

Смежные вопросы