iOS: сохранение общего экземпляра

#objective-c #ios #retain

#objective-c #iOS #сохранить

Вопрос:

Я использую общий экземпляр одноэлементного класса в функции, нужно ли мне выполнять retain над объектом? Несколько примеров, которые я видел, делают это: AVAudioSession *session = [[ AVAudioSession sharedInstance] retain]; в то время как некоторые просто делают: AVAudioSession *session = [ AVAudioSession sharedInstance]; . Я уверен, что где-то есть правило, которое должно подсказать мне, что делать, но я просто его не знаю.

Ответ №1:

Просто обращайтесь с ним так, как если бы это был любой другой объект. Иногда одноэлементный класс переопределяет методы управления памятью, чтобы гарантировать, что он не будет освобожден, но нет способа узнать, есть ли это у общего объекта. С общими объектами и одиночными элементами, которые этого не делают, если первый будет освобожден, при необходимости будет создан новый. Поэтому, если вам нужно убедиться, что указатель действителен в будущем методе, сохраните общий объект, когда вы его получите. Если вам не нужно его сохранять, вам не нужно ничего делать, поскольку sharedInstance метод автоматически вернет его.

Ответ №2:

Вы правы, есть правила, которые говорят вам, что делать. Это те же правила, которые вы используете везде в Cocoa Touch. Клиентам singleton не должно быть дела до того, что используемый ими объект является singleton, и они определенно не должны полагаться на одноэлементность singleton, чтобы избежать обычных соглашений об управлении памятью.

Да, если вы знаете, что объект является синглтоном, и вы знаете, что он не будет освобожден, его сохранение может показаться излишним. С другой стороны, сохранение синглтона при его приобретении и освобождение по завершении лучше документирует намерения программиста и позволяет избежать необходимости объяснять кому-либо (включая вас в будущем), почему можно не сохранять этот конкретный объект. Самое главное, это предотвращает зависимость вашего кода от деталей реализации какой-либо другой части вашего кода.

Ответ №3:

вам не нужно сохранять sharedInstances, потому что это реализовано как одноэлементный класс.

Комментарии:

1. Джалия здесь в точку. Нет необходимости сохранять, поскольку синглтон обычно имеет шаблон, эквивалентный выполнению этого в sharedInstance: static myStaticInstance = [[MyClass alloc] init];

2. Вызывающий код не должен делать предположений о том, как класс управляет своей памятью. Класс может представлять интерфейс, подобный singleton, но на самом деле иногда предоставляет вам новый экземпляр. Если вы полагаетесь на синглтон в этом случае, вы можете в конечном итоге получить зависший указатель. @pho0