Создание «постоянного» объекта Какао - PullRequest
0 голосов
/ 14 мая 2010

У меня есть фабрика объектов, которая раздает экземпляры нескольких «постоянных» неизменных объектов. Я бы хотел, чтобы эти объекты были защищены от плохого управления памятью клиентами. Вот как я переопределил ключевые методы класса. Я что-то упускаю (код или другие соображения)?

- (id)retain
{
    return self;
}

- (NSUInteger)retainCount
{
    return UINT_MAX;
}

- (void)release
{
    // nothing.
}

Обновление для последующих читателей Drive-by: Это был (специально) вопрос о какао с двойным черным бриллиантом. Если вы пытаетесь создать обычный синглтон, ознакомьтесь с ответами ниже, касающимися общих экземпляров и т. Д. Этот вопрос (и выбранный ответ) попадает в раздел «вы должны быть уверены, что знаете, что делаете», прежде чем выбрать эту стратегию реализации .

Ответы [ 4 ]

2 голосов
/ 14 мая 2010

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

http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html

http://boredzo.org/blog/archives/2009-06-17/doing-it-wrong

И, конечно, документация Apple здесь и здесь .

1 голос
/ 14 мая 2010

Хммм, чтобы действительно сделать его постоянным:

- (void) dealloc
{
    return;
    [super dealloc]; // stop compiler warning
}

Но какое это имеет преимущество? Ваши клиенты не соблюдают хорошо документированные правила управления памятью?

1 голос
/ 14 мая 2010

Идея разорвать договор о сохранении / освобождении имеет очень неприятный запах. Будет ли что-то вроде хранения ссылки на одноэлементные объекты в объекте класса достаточно хорошим? Тем самым вы предотвратите освобождение объекта в обычном коде.

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

1 голос
/ 14 мая 2010

Вы также можете переопределить copyWithZone: и autorelease:

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

- (id)autorelease
{
    return self;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...