iOS: сохранение общего экземпляра - PullRequest
4 голосов
/ 31 мая 2011

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

Ответы [ 3 ]

7 голосов
/ 31 мая 2011

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

5 голосов
/ 31 мая 2011

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

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

1 голос
/ 31 мая 2011

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

...