Каков эффект от импорта статической структуры из C в Objective-C?

#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.