У меня есть класс Film, в каждом из которых хранится уникальный идентификатор. В C #, Java и т. Д. Я могу определить статический int currentID, и каждый раз, когда я устанавливаю ID, я могу увеличивать currentID, и изменение происходит на уровне класса, а не на уровне объекта. Можно ли это сделать в Objective-C? Мне было очень трудно найти ответ на этот вопрос.
initialize
вызывается один раз для каждого класса (суперклассы перед подклассами), но если подкласс не переопределяетinitialize
, родительский классinitialize
будет вызван снова. Следовательно, требуется защита, если вы не хотите, чтобы этот код выполнялся дважды. См. Инициализация объекта класса в документации Apple по Objective-C.Начиная с Xcode 8, вы можете определить свойства класса в Obj-C. Это было добавлено для взаимодействия со статическими свойствами Swift.
Вот пример
Тогда вы можете получить к нему доступ так:
Вот очень интересный пояснительный пост, который я использовал как ссылку для редактирования этого старого ответа.
2011 Ответ: (не используйте это, это ужасно)
Если вы действительно не хотите объявлять глобальную переменную, есть другая опция, может быть, не очень ортодоксальная :-), но она работает ... Вы можете объявить метод get & set следующим образом, со статической переменной внутри:
Итак, если вам нужно получить значение, просто позвоните:
И тогда, когда вы хотите установить его:
Если вы хотите установить псевдостатическую переменную равной nil, вы можете объявить
testHolder
так:И два удобных метода:
Надеюсь, поможет! Удачи.
источник
.m
файлов, и я думаю, что это нормально, чтобы она была "глобальной" внутриClass.m
файла.В вашем файле .m вы можете объявить переменную как статическую:
Затем вы можете инициализировать его по своему
+(void)initialize
методу.Обратите внимание, что это обычная статическая переменная C, которая не является статической в том смысле, в каком ее считают Java или C #, но даст аналогичные результаты.
источник
В вашем файле .m объявите глобальную переменную файла:
затем в вашей процедуре инициализации, что ссылка:
или если это нужно изменить в другое время (например, в вашем методе openConnection), то увеличьте его там. Помните, что он не является потокобезопасным, как есть, вам нужно будет выполнить синхронизацию (или, что еще лучше, использовать атомарное добавление), если могут возникнуть какие-либо проблемы с потоками.
источник
Как сказал pgb, здесь нет «переменных класса», только «переменные экземпляра». Метод target-c для работы с переменными класса - это статическая глобальная переменная внутри файла .m класса. «Статический» гарантирует, что переменная не может быть использована вне этого файла (то есть она не может быть внешней).
источник
Здесь будет вариант:
Обратите внимание, что этот метод будет единственным методом доступа к идентификатору, поэтому вам придется как-то обновить его в этом коде.
источник
(Строго говоря, не ответ на вопрос, но по моему опыту, вероятно, будет полезен при поиске переменных класса)
Метод класса часто может играть многие роли, которые переменная класса играет в других языках (например, изменение конфигурации во время тестов):
Теперь объект класса
MyCls
вызываетResource:changeSomething:
со строкой@"Something general"
при вызовеdoTheThing:
, но объект, полученный изMySpecialCase
этой строки@"Something specific"
.источник
Вы можете переименовать класс в classA.mm и добавить в него функции C ++.
источник
Другой возможностью было бы иметь небольшой
NSNumber
синглтон подкласса.источник