переменные класса target-c: когда вызывается Dealloc?

Если я объявляю переменные класса в Objective-C, когда освобождается память?

Если мой интерфейс:

@interface TestClass : NSObject
{
}

+ (NSString)instanceCount;

@end

И в реализации я заявляю:

static NSString instanceCount;

Как мне освободить эту переменную уровня класса? то есть когда дело вызывается для переменных класса в Objective-C?


person user79889    schedule 19.03.2009    source источник
comment
Просто наткнулся на этот вопрос, изучая Obj-C. Apple, похоже, предполагает, что такой вещи, как переменная класса, не существует, и то, что вы определили в интерфейсе, представляет собой скорее метод класса, который отделен от статической переменной и, следовательно, должен быть определен в реализации. . Статическая переменная ограничена областью действия файла реализации, а не самого класса. Возможно, это небольшое замечание, но оно меня на секунду смутило: developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/   -  person James Wheare    schedule 11.10.2009


Ответы (1)


Краткий ответ на ваш вопрос: «когда программа выходит».

Статические переменные выделяются в самом начале вашей программы, до начала функции main(). Точно так же они будут освобождены в самом конце вашей программы, вскоре после выхода main(). Это управление памятью обрабатывается средой выполнения Objective-C, и все это происходит за кулисами.

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

- (void)dealloc
{
    NSLog(@"I am being deallocated");
    [super dealloc];
}

Вы никогда не увидите это сообщение в журнале. На это есть несколько причин. Во-первых, переменные, которые требуются NSLog(), возможно, уже были освобождены как часть обычной процедуры завершения работы. Во-вторых, потому что исполняющая система может просто освободить всю оставшуюся память за один раз, не утруждая себя вызовом dealloc методов.

Это может быть проблематично, если ваш пользовательский класс делает что-то важное в своем методе dealloc. Если это так, рассмотрите возможность написания собственного метода cleanup, который вы вызываете для этих объектов непосредственно перед выходом из программы.

person e.James    schedule 19.03.2009
comment
не говоря уже о том, что Dealloc является методом экземпляра и может вызываться 0 или 100 раз для класса - person cobbal; 19.03.2009
comment
Хм, да, но я думал об этом методе в объекте, который использовался как статический член другого класса. Я (надеюсь) прояснил это в своем ответе. Спасибо, что указали на это! - person e.James; 19.03.2009