Какая часть «Objective-C», которую я изучаю, является универсальной Objective-C, а не средами Apple? - PullRequest
11 голосов
/ 06 июня 2010

Этот вопрос связан с одним из моих других вопросов о C: Что вы можете сделать в C без включения «std»? Являются ли они частью «C» или просто библиотеками?

В последнее время мне стало любопытно, что на самом деле содержит основной язык Objective-C, и какие части Objective-C, которые я сделал для разработки iPhone / OS X, специфичны для платформ Apple.

Я знаю, что такие вещи, как синтаксис, одинаковы, но, например, это NSObject и его поток NS -подклассов фактически является частью "стандартного" Objective-C? Могу ли я использовать их, скажем, в Windows?

Какие части по большей части универсальны, и какие части я найду только на платформе Apple?

Если хотите, приведение примера Objective-C, используемого в другом месте, в качестве примера того, что является более "универсальным", также помогло бы мне.

Спасибо! =)

Ответы [ 4 ]

13 голосов
/ 06 июня 2010

Существуют только две текущие реализации основных библиотек Objective-C, ранее известные как NextStep (отсюда префиксы NS) и OPENSTEP: GNUStep и Apple OS X. Если в Linux поддерживается совместимость с В спецификации OPENSTEP GNUStep работает очень хорошо. Тем не менее, спецификация древняя, и современный код для OS X, вероятно, не будет работать правильно (особенно в области пользовательского интерфейса). Ситуация на Windows еще хуже.

Вы можете использовать язык Objective-C везде, где GCC поддерживает цель сборки. Классы "NS" не являются частью самого языка.

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

4 голосов
/ 06 июня 2010

Objective-c является C плюс эти ключевые слова:

@interface, @implementation, @protocol, @end, @private, @protected, @public, @try,
@throw, @catch, @finally, @class, @selector, @encode, @"string", @synchronized,
@property, @synthesized

Плюс синтаксис отправки сообщения: [anObject aMessage];

EDIT

Учитывая, что у вас есть компилятор Objective-C, такой как GCC, вам все еще нужно время выполнения Objective-C для того, чтобы вышеуказанные вещи работали. например [anObject aMessage] фактически скомпилировано в

objc_msgSend( anObject, @selector(aMessage));

... поэтому символ objc_msgSend является одним из нескольких, которые должны существовать во время выполнения. Теоретически это может быть обеспечено встроенным компилятором, но на практике вы, вероятно, собираетесь ссылаться на библиотеку времени выполнения Objective-c - быстрый поиск моего жесткого диска показывает, что у меня установлено три: - Apple , GNUStep и Cocotron - их больше, но Apple (с открытым исходным кодом), без сомнения, является наиболее важной и влиятельной.

С компилятором Objective-C и средой выполнения - но без каких-либо каркасов Apple Objective-C (NSObject и т. Д.) - у вас есть невероятные и очень полезные C-with-Classses, которые намного проще (где проще означает «лучше для меня»), чем C ++.

2 голосов
/ 06 июня 2010

Вы можете многое на Windows, используя Cocotron , который является бесплатной реализацией фреймворков Apple. Он не завершен, и вы можете столкнуться с ошибками, но если вам повезет, вы можете скомпилировать свой проект Xcode как приложение для Windows без особых изменений.

2 голосов
/ 06 июня 2010

Ни одна из библиотек классов не является частью самого языка. Если вы хотите увидеть основные типы Objective-C, посмотрите в include / objc. Сам основной язык без какой-либо добавленной библиотеки действительно скуден и не особенно полезен.

Однако на практике Objective-C практически никогда не используется вне контекста среды OpenStep, такой как Cocoa или GNUstep. Таким образом, вы можете рассматривать это как стандартную библиотеку де-факто, и в этом случае Foundation практически универсален. (Не 100% Foundation - это так, но большинство есть.)

...