2012-03-02 2 views
3

Я немного запутался в поиске синтаксиса стиля C в проекте Objective-C (например, ниже синтаксис не так, как метод определен в Objective-C, в книге). Понятно, что это работает, поскольку код, который я компилирует без ошибок, - но я не уверен, как и почему этот код является регулярным. Objective-C .h, .m файлов. Может кто-нибудь объяснить, как это вписывается?Можем ли мы написать код Objective-C в синтаксисе стиля C?

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
//use of round brackets 

void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, 
CGColorRef endColor); 
// C style syntax for passing params 

Кроме того, это очень специфично вокруг кода Core Graphics, что я видел до сих пор, это разрешено писать регулярные методы Objective-C, как этого также или только файлы с CG кода ...?

ответ

4

Objective-C является лишь надстройкой С, в то же как C++. (Оба изначально были реализованы как препроцессоры, которые преобразуют код в прямой код C.) Вызов метода Objective-C переводится на вызовы функции C objc_msgSend() (и его варианты), и это возможно (хотя и утомительно) вызвать его напрямую.

жуткие подробности изложены здесь:

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

+0

есть какие-либо руководящие принципы или правила большого пальца при написании кода, что это сочетание Objective-C и чистых с. (например, управление памятью, кастинг) и т. д. – dotnetcoder

+0

, и означает ли это, что я могу написать класс цели-c и использовать в нем метод c-stye, кажется немного странным, но имеет смысл тогда. – dotnetcoder

+0

Ничто не выходит за рамки правил для Objective-C, поскольку весь код Objective-C является таким «микс». Объекты Obj-C являются обычными указателями и могут рассматриваться как таковые. Просто имейте в виду правила владения Obj-C, если вы не используете ARC (см. Https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html) и используйте API Obj-C, где это необходимо - например, не вызывайте free() на объект Obj-C, используйте метод release. – davehayden

3

Core Graphics - это API C, а не Objective-C. Поскольку Objective-C является надмножеством C, любой допустимый C-код будет скомпилировать только в файлах .m.

2

Objective-C - это надмножество C, поэтому вы можете определить простые старые функции C в файле .m, и вы можете вызывать простые старые функции C в файле .m с использованием обычного синтаксиса C.

Функция CGColorSpaceCreateDeviceRGB является простой старой функцией C. Он является частью структуры Core Graphics (также известной как Quartz 2D), которая имеет чистый API C - API использует только C, а не Objective-C.

Вы не можете определить объектные методы Objective-C, используя простой старый синтаксис функции C - вы должны использовать синтаксис метода Objective-C. И вы не должны пытаться отправлять сообщения объектам Objective-C с использованием простого старого синтаксиса C - вы должны использовать синтаксис отправки сообщения Objective-C (квадратные скобки).

0

objc поддерживает стандарт C, поэтому вы найдете код c в проекте objc.

Что касается структуры, представленной Apple, если он имеет core префикс, как CG стоя на core graphic, это обычно означает, что он написан на C.