Хочу изучить Objective C, но синтаксис очень сбивает с толку

При происхождении из среды Java, которую я предполагаю, это ожидается. Я действительно любил бы изучать Objective C и начинать разрабатывать приложения для Mac, но синтаксис просто уничтожает меня.

Например:

-(void) setNumerator: (int) n
{
    numerator = n;
}

Что то, что тире для и почему сопровождается пустотой в круглой скобке? Я никогда не видел пусто в круглой скобке в C/C++, Java или C#. Почему у нас нет точки с запятой после (интервала) n? Но у нас действительно есть он здесь:

-(void) setNumerator: (int) n;

И что с этим выделением, init, процессом выпуска?

myFraction = [Fraction alloc]; 
myFraction = [myFraction init];
[myFraction release];

И почему это [myFraction release]; и нет myFraction = [myFraction release]; ?

И наконец что со знаки и что эта реализация эквивалентна в Java?

@implementation Fraction

@end

Я в настоящее время читаю Программирование в Objective C 2.0, и это просто так разбивает изучение этого нового синтаксиса для кого-то в фоне Java.

ОБНОВЛЕНИЕ 1: После чтения всех этих ответов и Программирования в Objective C 2.0 немного далее, это все начинает иметь смысл теперь!

ОБНОВЛЕНИЕ 2: Спасибо за большую "многоязычную поддержкой" подсказку. Мы можем объединить эти два оператора в один как так:

myFraction = [Fraction alloc]; 
myFraction = [myFraction init];

Может быть уменьшен до:

myFraction = [[Fraction alloc] init]; 

20
задан Sahat Yalkabov 10 June 2010 в 05:18
поделиться

5 ответов

Для чего это тире и почему за ним следует void в скобках?

Тире - означает "уровень экземпляра" (который в Java используется по умолчанию). Если вы видите знак плюс +, это означает уровень класса (так же, как использование static в Java)

void в скобках - это тип возврата, см. ниже.

Почему у нас нет точки с запятой после (int) n? Но здесь она есть:

-(void) setNumerator: (int) n;

Поскольку это сигнатура метода, можно считать, что это интерфейс:

 interface YourClass {
      void setNumerator(int n );// see? semicolon
 }

Та же ситуация.

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

Эквивалентом, если бы такая вещь существовала в java, было бы:

// YourClass.java.h 

 interface YourClass {
      void setNumerator(int n );
 }
 // YourClass.java.m
 class YourClass {
      void setNumerator( int n ) {
       this.n = n;
      }
  }

И что это за процесс alloc, init, release?

myFraction = [Fraction alloc]; 
myFraction = [myFraction init];
[myFraction release];

allo-init - это эквивалент для new в Java, alloc - это когда вы запрашиваете память для вашего объекта, alloc запрашивает память, а init вызывает метод init, эквивалентный конструктору класса Java (кстати, Ruby делает то же самое за сценой)

В Java нет эквивалента освобождению, потому что он собирается в мусор, в Objective-C вы должны освободить свой объект.

BTW, инициализация также может быть myFraction = [[Fraction alloc]init];

И, наконец, что это за знаки @ и каков эквивалент этой реализации в Java?

 @implementation Fraction

 @end

Это определение класса, как я уже говорил.

Я сейчас читаю "Программирование на Objective C 2.0", и для человека с опытом работы на Java изучение этого нового синтаксиса просто удручает.

Вот связанный ответ, который поможет вам лучше познакомиться с квадратными скобками:

Краткая история "квадратных скобок", как я ее помню.

29
ответ дан 29 November 2019 в 23:48
поделиться

Возможно, у вас есть возможность получить представление о Objective-C на вики-странице. Я только что сделал и нашел большинство ваших ответов.

http://en.wikipedia.org/wiki/Objective-C

Я тоже из фона java, на первый взгляд Objectivec не выглядит слишком привлекательным.

Это похоже на C ++ с небольшими фрагментами синтаксиса на лице.

Для чего это прочерк и почему в скобках стоит void?

минус здесь означает метод экземпляра, плюс означает метод класса

Я никогда не видел void в скобках в C / C ++, Java или C #.

это возвращаемый тип

Почему у нас нет точки с запятой после (int) n?

Если вы не предоставляете тело метода, то синтаксис является объявлением метода, а не реализацией.

И, наконец, что со знаками @ и что это за реализация эквивалентна в Java?

@implementation Fraction

@end

в Java, вероятно, будет

public class Fraction {

}
6
ответ дан 29 November 2019 в 23:48
поделиться

Исходя из той же книги, знак "-" сообщает компилятору, что метод является методом экземпляра (который изменяет данные). Однако знак «+» сообщает компьютеру, что это метод класса (статический).

2
ответ дан 29 November 2019 в 23:48
поделиться

Вы сказали, что читаете "Программирование на Objective C 2.0" Стивена Кочана. Возможно, это не так быстро, как вам хотелось бы, но некоторое время, проведенное с головой в этой книге, сослужит вам хорошую службу. Все, о чем вы спрашиваете, рассматривается в книге Кочана. Вы можете дополнить ее тем, что найдете на сайте Apple, в Википедии и на сайте O'Reilly MacDevCenter.com, например, "Inside the Objective-C Runtime". Динамическая реализация объектов в Objective C немного отличается от Java или C++ и имеет другой вид, возможно, из-за подхода, вдохновленного Smalltalk. Возьмите Кочана, дополните его веб-страницей и посмотрите, были ли здесь рассмотрены ключевые моменты. Если нет, то это будет отличное место для них.

2
ответ дан 29 November 2019 в 23:48
поделиться

Я тоже только начинаю работать с Objective C и согласен с тем, что синтаксис кажется чужим по сравнению с Java или C++. Лучшее, что я нашел, это просто прочитать примеры кода. Я уверен, что вы сможете найти много примеров, немного погуглив. Мне не разрешено размещать более одной ссылки, но если вы погуглите "objective c example code", то найдете много кода.

Если вы просто ищете краткую справку о том, что означает некоторый странный синтаксис, то вот неплохой учебник:

http://cocoadevcentral.com/articles/000082.php

2
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: