2013-04-25 6 views
1

У меня есть одноэлементный объект в моем приложении:Должен ли я освободить объект singleton?

+ (id)shared { 
    @synchronized(self) { 
     if (sharedDownloadFirstData == nil) 
      sharedDownloadFirstData = [[self alloc] init]; 
    } 
    return sharedDownloadFirstData; 
} 

- (id) init { 
    if (self = [super init]) { 

    } 
    return self; 
} 

И я хочу знать, если мне нужно realese его (я не использую ARC). Для этого я использую:

[[DownloadFirstData shared] release]; 

Должен ли я освободить этот объект? У меня есть массив и другие вещи в объекте, которые мне нужно выпустить.

+0

Если это должно продолжаться до тех пор, пока приложение не закончится, нет необходимости в явном выпуске. Хотя, возможно, вы захотите предоставить его просто, чтобы сделать анализатор счастливым. –

+0

Почему мне не нужно его выпускать? у него есть автовыпуск? – MTA

+0

нет, у него нет автореферата (если вы не поставили автореферат). Он будет убит, когда приложение закончится (как и все объекты, все еще в памяти), поэтому память свободна. –

ответ

6

В Objective-C вы должны всегда звонить только release на свой собственный объект. Это обычно означает объект, который вы создали с помощью alloc, init, copy или mutableCopy или иначе называется retain. Здесь потребитель [DownloadFirstData shared] не вызывал ни одну из этих функций и не несет ответственности за его освобождение. Вы увидите это в любое время, например, по телефону [UIColor blackColor].

Вы можете позвонить retain на таком объекте, если вы пересечение границы autorelease или просто не уверены в жизни:

DownloadFirstData *local = [[DownloadFirstData shared] retain]; 
... 
[local release]; 

В этом случае, вы взяли собственность и несут ответственность за отпуская.

А как насчет определения shared? Когда вы определяете метод, не использующий init ..., вы, как правило, несете ответственность за то, чтобы уйти с номером выпуска 0, с чем-то вроде [[self alloc] init] autorelease]. Это не относится к синглону, потому что ваша цель состоит в том, чтобы он всегда существовал и, следовательно, всегда имел ненулевое значение счета. Вы делаете это просто, не выпуская его после его создания.

1

нет смысла иметь синглтон, если вы его отпустите. Обычно синглтон создается, потому что вам нужен тот же объект, пока приложение не закончится. В конце жизненного цикла приложения вся память, связанная с приложением, освобождается.

Используйте стандартный подход, если вам нужно выделять выпуск часто. Если ваш синглтон занимает много памяти, вы должны подумать о том, чтобы написать его лучше.

в любом случае, [[DownloadFirstData shared] release]; будет работать.

+0

Отправка 'release' будет _work_, да, но это неверно из права собственности: объект singleton сам владеет.Действительно, ваше первое предложение - правильный ответ. –

+1

Это должно создать предупреждение компилятора или ошибку статического анализатора. Имя «shared» не означает передачу права собственности. –

+0

Я только что сказал, что сработает. а не то, что это правильно. : D –

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