статический NSStrings в Objective C

Я часто вижу фрагмент кода как это в методах экземпляров классов:

static NSString *myString = @"This is a string.";

Я, может казаться, не выясняю, почему это работает. Это - просто objc эквивалент #define, это ограничено объемом метода? Я (думаю), что понимаю статическую природу переменной, но более конкретно о NSStrings, почему это не являющийся alloc'd, init'd?

Спасибо ~

6
задан MikeyWard 22 May 2010 в 13:16
поделиться

4 ответа

Что касается NSString alloc, init:

Сначала я думаю, что это можно рассматривать как удобство, но это не то же самое для [[NSString alloc] init].

Я нашел здесь полезную ссылку. Вы можете взглянуть на это NSString и ярлыки

Для части static и #define:

статический экземпляр в классе означает, что вы можете получить доступ, используя любой экземпляр класса. Вы можете изменить значение static. Для функции это означает, что значение переменной сохраняется между вызовами функций

#define - вы помещаете макроконстанту, чтобы избежать магического числа и строки, и определяете макросы функций. #define MAX_NUMBER 100. тогда вы можете использовать int a [MAX_MUMBER]. Когда код скомпилирован, он будет скопирован и вставлен в int a [100]

1
ответ дан 8 December 2019 в 13:44
поделиться

Это особый случай инициализации для NSString, который просто указывает указатель NSString на экземпляр, выделенный и инициированный при запуске (или, может быть, лениво, я не уверен.) Существует один из этих экземпляров NSString, созданный таким образом для каждого уникального @ "", которое вы используете в своей программе.

Также я думаю, что это правда, даже если вы не используете ключевое слово static. Более того, я думаю, что все другие NSString, инициализированные этой строкой, будут указывать на один и тот же экземпляр (не проблема, потому что они неизменяемы).

Это не то же самое, что #define, потому что у вас действительно есть переменная NSString, создавая строку с инициализация = @ "что угодно". Это кажется более эквивалентным c const char * somestr = "бла-бла-бла" .

1
ответ дан 8 December 2019 в 13:44
поделиться

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

Во-первых, почему он не выделяется и не инициализируется. Ответ заключается в том, что когда вы напишете строковый литерал Objective-C в форме @ "foo" , компилятор Objective-C создаст для вас экземпляр NSString .

Другой вопрос - что делает модификатор static . Он делает то же самое, что и в функции C, гарантируя, что переменная myString одинакова при каждом использовании метода (даже между разными экземплярами объекта).

Макрос #define - это нечто совершенно иное: это «программная вырезка и вставка» исходного кода, выполняемая до того, как код поступит в компилятор.

9
ответ дан 8 December 2019 в 13:44
поделиться

Вы не видите вызова alloc/init, потому что конструкция @"..." создает constant строку в памяти (через компилятор).

В данном контексте static означает, что к переменной нельзя получить доступ вне файла, в котором она определена.

2
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: