При происхождении из среды 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];
Для чего это тире и почему за ним следует 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 изучение этого нового синтаксиса просто удручает.
Вот связанный ответ, который поможет вам лучше познакомиться с квадратными скобками:
Возможно, у вас есть возможность получить представление о 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 {
}
Исходя из той же книги, знак "-" сообщает компилятору, что метод является методом экземпляра (который изменяет данные). Однако знак «+» сообщает компьютеру, что это метод класса (статический).
Вы сказали, что читаете "Программирование на Objective C 2.0" Стивена Кочана. Возможно, это не так быстро, как вам хотелось бы, но некоторое время, проведенное с головой в этой книге, сослужит вам хорошую службу. Все, о чем вы спрашиваете, рассматривается в книге Кочана. Вы можете дополнить ее тем, что найдете на сайте Apple, в Википедии и на сайте O'Reilly MacDevCenter.com, например, "Inside the Objective-C Runtime". Динамическая реализация объектов в Objective C немного отличается от Java или C++ и имеет другой вид, возможно, из-за подхода, вдохновленного Smalltalk. Возьмите Кочана, дополните его веб-страницей и посмотрите, были ли здесь рассмотрены ключевые моменты. Если нет, то это будет отличное место для них.
Я тоже только начинаю работать с Objective C и согласен с тем, что синтаксис кажется чужим по сравнению с Java или C++. Лучшее, что я нашел, это просто прочитать примеры кода. Я уверен, что вы сможете найти много примеров, немного погуглив. Мне не разрешено размещать более одной ссылки, но если вы погуглите "objective c example code", то найдете много кода.
Если вы просто ищете краткую справку о том, что означает некоторый странный синтаксис, то вот неплохой учебник: