2016-09-30 6 views
1

Это сообщение моего вопроса раньше, но из-за слишком большого количества изменений, и я упростил свои примеры, я подумал, что было бы яснее, если бы я создал новый вопрос, вместо того чтобы повторно редактировать вопросы несколько раз ,UISwitch не освобождает

ПРОБЛЕМА:
UISwitch объект как-то не освобождает даже тогда, когда ничего не было сделано с ним.


ПРОЕКТ:
Есть только два вид контроллера. VC1 и VC2. VC1 имеет одну кнопку для подачи VC2. VC2 содержит одну кнопку, чтобы отклонить себя и имущество изготовителя UISwitch, UILabel и UIStepper.

VC1:

class VC1: UIViewController { 

    let button = UIButton() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.addSubview(button) 

     button.addTarget(self, action: #selector(open), for: .touchUpInside) 

     // Some auto layout (not relevant to the question) 
    } 

    func open() { present(VC2(), animated: true) } 
} 

VC2:

class VC2: UIViewController { 

    let button = UIButton() 

    let shifty = CustomSwitch() // Note: nothing has been done with this 
    let labels = CustomLabels() 
    let steppy = CustomSteppy() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.addSubview(button) 

     button.addTarget(self, action: #selector(close), for: .touchUpInside) 

     // Some auto layout (not relevant to the question) 
    } 

    func close() { dismiss(animated: true) } 
} 

подклассы:

class CustomSwitch: UISwitch { deinit { print("Switch has been deinitialized") } } 
class CustomLabels: UILabel { deinit { print("Labels has been deinitialized") } } 
class CustomSteppy: UIStepper { deinit { print("Steppy has been deinitialized") } } 

Единственная причина, которую я создал эти подклассов s o Я мог бы легче проследить их в профилировщике. То же самое происходит даже тогда, когда я не подклассы UISwitch.

EDIT:
Я добавил deinit к подклассам и как UILabel, а также UIStepper показывает сообщение:

Labels has been deinitialized 
Steppy has been deinitialized 

Так что, кажется, не UISwitch становятся деинициализируются.

SCREENSHOT:
В этом скриншоте, я открыл и закрыл VC2 несколько раз. Там вы можете видеть только объект CustomSwitch остался постоянным, а CustomLabels и CustomSteppy был освобожден так, как должен быть.

Original state

Как было предложено Rmaddy, а также причина, почему я хотел создать новый вопрос является результатом подсчета ссылок. Я следил за некоторыми объяснениями по поводу SO, но я не очень уверен, что делать из этого полностью.

Reference counts (collapsed)

Reference counts


ВОПРОС:
Почему это UISwitch ведет себя, как это и как я могу это исправить?

+0

Вы сделали то, что я предложил по вашему предыдущему вопросу? В качестве напоминания, чтобы проверить флажок «Record Reference Counts» в приложении «Инструменты» и профайл приложения снова. Затем посмотрите, что поддерживало ссылку на каждый коммутатор. – rmaddy

+0

@rmaddy Извините, да, я сделал это, и я забыл добавить эти скриншоты. Я не уверен, что делать из этого, хотя я действительно запутался прямо сейчас. Попытка и поиск, чтобы исправить это, но все еще не повезло. –

+0

Отображает счет как +0. Это означает, что он должен был быть освобожден. Вы тестируете на реальном устройстве или симуляторе? Я не доверяю симулятору для таких вещей. – rmaddy

ответ

0

Это (окончательно) исправлено в iOS 10.2