2010-05-22 8 views
6

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

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

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

Благодаря ~

ответ

1

Для части NSString Alloc, INIT:

Я думаю, что первый, это можно рассматривать как удобство, но не в равной степени то же самое для [[NSString Alloc] инициализации] ,

Я нашел полезную ссылку здесь. Вы можете посмотреть на этой NSString and shortcuts

Для части статической и #define:

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

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

+0

Почему я получил нижний предел здесь? – vodkhang

+1

Это был не я, но я согласен - ваш ответ просто непонятен. См. Мой ответ, он разбивает вопрос о оригинальном постере на три разные темы (как обрабатываются «литералы» @ «литералы», что делает ключевое слово 'static', и как это отличается от' # define') и дает четкие ответы что, надеюсь, люди могут чему-то научиться. – harms

+0

А, ок. Мне не хватало части статичности. Потому что, в первый раз, я знаю только об NSString alloc, init, поэтому я отвечаю только за эту часть. Я отредактирую свой ответ – vodkhang

1

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

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

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

9

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

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

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

2

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

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

4

Просто наткнулся на ту же самую декларацию static NSString. Я задавался вопросом, как именно эта статическая магия работает, поэтому я немного прочитал. Я только собираюсь обратиться к статической части вашего вопроса.

Согласно K&R каждая переменная в C имеет два основных признака: типа (например, с плавающей точкой) и хранения класса (автоматический режим, регистр, статический, EXTERN, ЬурейеЕ).

статический класс хранения имеет два различные эффекты в зависимости от того, является ли оно используется:

  • внутри блока кода (например, внутри функции),
  • вне всех блоков (на тот же уровень, что и функция).

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

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

Если вы хотите узнать больше, ознакомьтесь с internal and external linkage in C.

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