#c #objective-c #inheritance #struct #static-variables
#c #objective-c #наследование #структура #статические переменные
Вопрос:
Я отлаживаю устаревшее приложение и столкнулся со следующим сценарием
LegacySource.h
cFunctionModifyingSomeVariable()
LegacySource.c
static struct someVariable; //a custom struct
ObjectiveCImplementation.m
#import LegacySource.h
-(void)workWithLegacy {
cFunctionModifyingSomeVariable(); // modifies variable declared in C class
}
Каков эффект от импорта статической структуры из C в Objective-C?
Все ли мои классы Objective-C используют один и тот же экземпляр статической структуры, или каждый экземпляр получает свой собственный? Другими словами, если я создам 3 экземпляра ObjectiveCImplementation , будут ли они изменять одну и ту же переменную или их эффекты будут независимы друг от друга?
Комментарии:
1. К вашему сведению — ответ ничем не отличается от включения
LegacySource.h
в любое количество файлов .c.
Ответ №1:
Код Objective-C someVariable
вообще не работает. Это просто вызов функции. Статическая структура не «импортируется» в Objective-C, что бы это ни значило.
В любом случае переменная someVariable
является единственной. Есть только одна такая переменная. Независимо от того, откуда cFunctionModifyingSomeVariable()
вызывается, он все равно работает только с этой одной переменной. Эта функция C не знает об экземплярах класса Objective-C или, в более общем смысле, ничего о его вызывающих, поэтому ее поведение не может отличаться в зависимости от этого.
Комментарии:
1. Спасибо! Приведет ли удаление статики из переменной к тому, что несколько экземпляров Objective-C перестанут мешать друг другу путем изменения одной переменной?
2. Нет. Нестатическая переменная области видимости файла по-прежнему является единственной; просто она имеет внешнюю связь. Это означает, что к нему можно получить прямой доступ с помощью кода в модулях, отличных от LegacySource.c (если они его объявят). Кроме того, переменные с внешней связью, по сути, находятся в глобальном пространстве имен, поэтому без
static
нее могут возникнуть конфликты имен с другими переменными с тем же именем с внешней связью.3. Чтобы сделать так, чтобы разные объекты не мешали друг другу, вам нужно будет сделать C API объектно-ориентированным. Например, рассмотрим различные типы Core Foundation, такие как
CFArray
илиCFDictionary
. Это все еще C API, но каждая функция принимает параметр, указывающий, с каким объектом она должна работать.4. Я рассмотрю возможность переноса объектов в функции C через параметры функции или просто перенесу логику из класса C в файл реализации objective-c.