вопросы о методах класса target-c - PullRequest
0 голосов
/ 18 января 2010

Я знаю, что переменные класса объявляются в памяти (в отличие от стека), когда класс инициализируется, и я знаю, как в основном используются методы класса.Но у меня есть несколько вопросов о методах класса, на которые нет ответов в базовой документации.

Метод класса также объявлен в памяти?Как насчет любого объекта, объявленного в этих методах класса?Они «статичны» по объему?Как насчет любых объектов, которые передаются в метод класса в качестве параметра?Это тоже «статично»?

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

Например, что происходит с методом do_something здесь:

+ (void) main
{
    while (i < MAX)
    {
        [MyClass do_something];
    }
}

+ (void) do_something
{
    NSMutableArray *array = [[NSMutableArray alloc] init];
    ...
    [array release];
}

Ответы [ 3 ]

1 голос
/ 18 января 2010

Все переменные хранятся «в памяти», независимо от их типа хранения (статическое, автоматическое, бесплатное хранилище), местоположения (стек или куча), связи или объема. Переменная является статической, только если она объявлена ​​статической. В противном случае переменные в методах класса, будь то параметры или локальные переменные, имеют функцию или локальную область видимости, автоматическое хранение, отсутствие связи и сохраняются в стеке.

Методы класса имеют глобальную область видимости и внешнюю связь, хотя вы можете отправить сообщение объекту (включая классы), даже если в области действия нет обработчика. Внутренняя связь должна быть возможной, но я не думаю, что язык поддерживает объявление методов с внутренней связью. Тип и расположение хранилища на самом деле не применяются к методам, но можно сказать, что методы имеют статическое хранилище.

1 голос
/ 18 января 2010

Методы класса следуют тем же правилам, что и методы объекта (экземпляра), за исключением того, что вы не можете получить доступ к переменным экземпляра из методов класса, очевидно, потому что ivars выделяется для экземпляра объекта.

В вашем примере "массив" выделяется в куче при каждом вызове, как обычно.

0 голосов
/ 18 января 2010

При вызове метода +(void) do_something объект array будет инициализироваться, как указано в вашем коде, каждый раз.Объявлена ​​только область действия этого метода.

Вы можете объявить статические переменные в области видимости класса.Они, как и следовало ожидать, доступны для всех экземпляров и методов класса (он же статический).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...