2010-07-28 2 views
2

У меня есть категория какао 'для добавления перегибов (плюрализация, сингулярность и т. Д.) В NSString. Код требует загрузки набора правил регулярного выражения и исключений из PLIST в словари и массивы, а также добавления ручных исключений из кода. Мне нужен способ сохранить эти структуры данных (как членов класса) между несколькими вызовами кода перегиба (все методы экземпляра). Я попытался:Статическая переменная в категории какао Категория

+ (NSMutableArray *)uncountables 
{ 
    static NSMutableArray *uncountables = nil; 
    if (uncountables == nil) uncountables = [NSMutableArray array]; 
    return uncountables; 
} 

Однако, похоже, что это случается не всегда. Есть ли хороший способ сделать это? Я не хочу подклассифицировать NSString, если это возможно. Благодарю.

+0

Вы используете сбор мусора? – Abizern

ответ

5
[NSMutableArray array]; 

возвращает автореализованный массив. Используйте вместо этого:

[[NSMutableArray alloc] init]; 
0

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

0

Как drawnonward уже упоминалось, [NSMutableArray array]; возвращает autoreleased массив. Но я не думаю, что это хорошая идея, чтобы вернуть неавтореализованный массив, потому что это противоречит концепциям управления памятью Cocoa - только alloc, copy и new должны быть выпущены вручную. Все остальные инициализации автореализовываются.

Таким образом, вы должны просто использовать

interface: 
NSArray *a; 

...somewhere in a code... 
a = [[NSString uncountables] retain]; 
... 

- (void)dealloc { 
    [a release]; 
} 

, чтобы правильно сохранить/выпущенные объекты.

+1

Нет, это нормально для объектов со статическим объемом. Подумайте об этом как о программе, утверждающей право собственности на объект. Тогда правила собственности не нарушаются. Правила владения не говорят, что объекты, которые вы получаете из методов (кроме NARC), * autoreleased *, говорят, что вы не * владеете * такими объектами. – JeremyP

+0

Джереми, я вижу, спасибо! – kovpas

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