Доступ к переменной экземпляра в методе стиля C - PullRequest
4 голосов
/ 11 марта 2011

Может ли кто-нибудь подтвердить, что вы не можете получить доступ к переменным экземпляра, определенным в блоке Objective C @implementation, из функций стиля C того же класса? Компилятор выдает ошибки: «XXX undeclared», где XXX - имя переменной экземпляра.

Вот пример того, что я объясняю:

   @interface FontManager : NSObject {      
                CGFontRef fontRef;
   }

   static int CstyleFunction() {
        NSUInteger emSize = CGFontGetUnitsPerEm(fontRef);
   }

Я хочу убедиться, что я не могу использовать "fontRef" из-за "CstyleFunction".

Любое понимание будет с благодарностью.

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

«Метод стиля C» на самом деле не заслуживает названия «метод», я бы назвал его «функцией», как в C.

Функция AC не имеет self, поэтомуне может неявно получить доступ к ivars как метод.Если вы передаете экземпляр функции C в качестве параметра, вы можете обращаться к ivars так же, как к полю в указателе структуры.

1 голос
/ 11 марта 2011

@ Anomie и @jlehr верны, функция C не имеет понятия об объекте FontManager и его текущем состоянии, просто она находится в одном файле.

Однако, если FontManager является одноэлементным и вы делаете свойство fontRef свойством (или создаете для него аксессор), тогда будет возможно получить доступ к значению в вашем классе C:

static int CstyleMethod() {
    FontManager *fm = [FontManager sharedManager];
    NSUInteger emSize = CGFontGetUnitsPerEm(fm.fontRef);
}

В итоге, вы можете смешивать и сочетать синтаксис C и ObjC в функциях C и методах ObjC. Но поскольку функции C не имеют ссылки на self по умолчанию (и связанных с ним переменных экземпляра объекта), вы можете ссылаться только на объекты ObjC, которые являются одиночными, хранятся в глобальной переменной или передаются в качестве параметров.

1 голос
/ 11 марта 2011

Это верно.Вы, кажется, смешиваете методы и функции.Методы существуют только в Objective-C.То, что вы называете «методом стиля C», на самом деле является просто функцией C.

C - это не объектно-ориентированный язык программирования.Поскольку в C нет такого понятия, как объект, в C не существует переменной экземпляра, поэтому переменная экземпляра fontRef не будет видна ни в опубликованной вами функции, ни в любой другой функции Cваша программа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...