2013-01-10 3 views
2

Здесь много статей об избежании удержания циклов с блоками, но как насчет использования классов и методов класса? Скажем, у меня есть класс вроде этого:Класс остается в памяти

// MyClass.h 

+ (void)doSomethingAsynch:(void (^)(void))block; 
+ (void)doSomethingElse; 

и звонящие хотел бы сказать следующее:

[MyClass doSomethingAsynch:^{ 
    [MyClass doSomethingElse]; 
} 

Должен вызывающий объявить unsafe_unretained копию MyClass? Или это класс, похожий на синглтон, который не будет увеличивать количество накоплений? Имеет ли значение, если мы отправим отсчет сохранения класса на Луну, так как мы хотим, чтобы он все время существовал?

ответ

4

[[NSObject class] retainCount] возвращается NSUIntegerMax, так, да, классы реализованы в виде одиночек и, вероятно, переопределить release как не оп.

Добавление:

В objc runtime implementation из NSObject в строке 1659 вы найдете ...

+ (id)retain { 
    return (id)self; 
} 

... которая проверяет, что [NSObject retain] ничего не делает.

2

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

+0

ОК спасибо. +1 здесь и + 1/исправить на @Nikolai b/c полезные эмпирические данные по подсчетам класса. – danh

-1

Вы раскрываете эти методы как методы static/class («+» спереди, а не методы типа «-»), поэтому, конечно, вам не нужно делать [[MyClass alloc] init] для этого конкретного класса, если вы только хотите использовать эти методы. Поскольку вы не используете alloc, вам не нужно беспокоиться о retain или release.

В эти дни с ARC (Auto подсчетом ссылок) вы в основном не придется беспокоиться о retain и release в любом случае, это добавляет все, что во время компиляции для вас.

EDIT: подчеркнул основном, поскольку есть моменты, когда вам все еще нужно беспокоиться об этом, также добавил некоторую ясность

+0

Я думаю, что кто-то сделал -1 здесь, потому что вам иногда нужно беспокоиться о памяти mgmt даже под ARC. Примером этого является сохранение циклов в блоках. – danh

+0

Я попытался добавить некоторую ясность в свой ответ, в этом случае это то же самое, что и статический класс со статическими методами в C#, основанный только на том, что предусмотрено в вопросе. –

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