Я часто вижу фрагмент кода как это в методах экземпляров классов:
static NSString *myString = @"This is a string.";
Я, может казаться, не выясняю, почему это работает. Это - просто objc эквивалент #define, это ограничено объемом метода? Я (думаю), что понимаю статическую природу переменной, но более конкретно о NSStrings, почему это не являющийся alloc'd, init'd?
Спасибо ~
Что касается NSString alloc, init:
Сначала я думаю, что это можно рассматривать как удобство, но это не то же самое для [[NSString alloc] init].
Я нашел здесь полезную ссылку. Вы можете взглянуть на это NSString и ярлыки
Для части static и #define:
статический экземпляр в классе означает, что вы можете получить доступ, используя любой экземпляр класса. Вы можете изменить значение static. Для функции это означает, что значение переменной сохраняется между вызовами функций
#define - вы помещаете макроконстанту, чтобы избежать магического числа и строки, и определяете макросы функций. #define MAX_NUMBER 100. тогда вы можете использовать int a [MAX_MUMBER]. Когда код скомпилирован, он будет скопирован и вставлен в int a [100]
Это особый случай инициализации для NSString, который просто указывает указатель NSString на экземпляр, выделенный и инициированный при запуске (или, может быть, лениво, я не уверен.) Существует один из этих экземпляров NSString, созданный таким образом для каждого уникального @ "", которое вы используете в своей программе.
Также я думаю, что это правда, даже если вы не используете ключевое слово static. Более того, я думаю, что все другие NSString, инициализированные этой строкой, будут указывать на один и тот же экземпляр (не проблема, потому что они неизменяемы).
Это не то же самое, что #define, потому что у вас действительно есть переменная NSString, создавая строку с инициализация = @ "что угодно". Это кажется более эквивалентным c const char * somestr = "бла-бла-бла"
.
Я думаю, что вопрос состоит из двух не связанных между собой частей.
Во-первых, почему он не выделяется и не инициализируется. Ответ заключается в том, что когда вы напишете строковый литерал Objective-C в форме @ "foo"
, компилятор Objective-C создаст для вас экземпляр NSString
.
Другой вопрос - что делает модификатор static
. Он делает то же самое, что и в функции C, гарантируя, что переменная myString
одинакова при каждом использовании метода (даже между разными экземплярами объекта).
Макрос #define
- это нечто совершенно иное: это «программная вырезка и вставка» исходного кода, выполняемая до того, как код поступит в компилятор.
Вы не видите вызова alloc
/init
, потому что конструкция @"..."
создает constant строку в памяти (через компилятор).
В данном контексте static
означает, что к переменной нельзя получить доступ вне файла, в котором она определена.