2013-02-11 4 views
1

Если я использую статический ресурс в классе Objective-C, создам ли я утечку памяти, не выпуская его? Что-то вроде следующего:Освобождение статических ресурсов в Objective-C

@interface MyClass : NSObject 

+ (MyClass *)sharedInstance; 

@end 

@implementation MyClass 

+ (MyClass *)sharedInstance 
{ 
    static MyClass * inst; 
    if (!inst) 
     inst = [MyClass new]; 
    return inst; 
} 

@end 

А) Есть ли сценарий, при котором приложение, использующее этот класс закрывается, и это статическое объявление создает утечку памяти?

B) Есть ли какой-либо метод класса, такой как + (void)unloadClassDefinition, который вызывается, когда определения классов очищаются из памяти? (Это даже случается?)

+0

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

ответ

6

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

A) Вся память вашего процесса восстанавливается, когда он завершается. Не существует такой вещи, как утечка, которая может сохраняться в конце вашего приложения.

B) Классы никогда не выгружаются после загрузки в среду выполнения Apple ObjC.

Если вы хотите, чтобы иметь возможность уничтожить этот объект, вам придется переместить переменную из этого метода, так что вы можете получить доступ к нему из другого, и сделать что-то вдоль этих линий:

static MyClass * inst; 
+ (MyClass *)sharedInstance 
{ 
    if (!inst) 
     inst = [MyClass new]; 
    return inst; 
} 

// Under ARC; under MRR you might monkey around with retain and release 
// This won't actually immediately destroy the instance if there are other 
// strong references to it. 
+ (void)destroySharedInstance 
{ 
    inst = nil; 
} 

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

1

Это не технически представляет собой утечку, потому что вы все еще имеете ссылку на память (статическую). Память останется неизменной, пока вы не установите inst = nil. Лучшей практикой было бы это сделать, когда вы знаете, что вы закончили использование объекта.

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