My:Objective-C — различия между версиями
WikiSysop (обсуждение | вклад) |
WikiSysop (обсуждение | вклад) (→Пример) |
||
(не показаны 24 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | Objective-C — это | + | Objective-C — это объектное расширение языка C. Каждая программа, написанная на C понимается и Objective-C (но естественно не наоборот). Новые ключевые слова в Objective-C начинаются с символа @. Кроме этого для вызов методов объектов |
+ | используются '''сообщения''' заключенные в квадратные скобки: <nowiki>[object message];</nowiki> | ||
+ | <pre class="brush:cpp; gutter: false;"> | ||
+ | [a doSomething]; // тоже, что a.doSomething(); в С++ | ||
+ | </pre> | ||
+ | == Пример == | ||
+ | Ниже следующий пример можно откомпилировать online: http://ideone.com/ | ||
+ | <pre class="brush:cpp; gutter: false;"> | ||
+ | #import <objc/objc.h> | ||
+ | #import <objc/Object.h> | ||
+ | |||
+ | @interface MyObj : Object // Объявление интерфейсной части объекта MyObj | ||
+ | { | ||
+ | int num; | ||
+ | } | ||
+ | - (void) print; // void MyObj::print() - процедура | ||
+ | - (int) getVal; // int MyObj::getVal() - функция | ||
+ | - (void) setVal: (int) v; // void MyObj::getVal(int v) - функция с параметром | ||
+ | - (int) calc:(int)x : (int)y; // int calc(int x, int y) | ||
+ | @end | ||
+ | |||
+ | @implementation MyObj // Описание методов объекта MyObj | ||
+ | - (void) print { printf("num=%d\n", num); } | ||
+ | - (int) getVal { return num; } | ||
+ | - (void) setVal :(int) v { num = v; } | ||
+ | - (int) calc :(int)x :(int)y { return x/y; } | ||
+ | @end | ||
− | + | int main() | |
− | + | { | |
− | [ | + | id obj = [[MyObj alloc] init]; |
+ | [obj setVal: 5]; // obj.setVal(); | ||
+ | printf("num =%d\n", [obj getVal]); // [...] возвращают значение ! | ||
+ | printf("calc=%d\n", [obj calc: 6 : 3]); // obj.calc(6,3) | ||
+ | [obj print]; // obj.print(); | ||
+ | return 0; | ||
+ | } | ||
</pre> | </pre> | ||
+ | * Приставка у классов, функций и директив NS происходит от NextStep | ||
+ | * #import аналогичен #include, но включается в код один раз (не надо обкладывать defin-ами). Кроме этого подключаемая библиотека содержит множество модулей (т.е. не надо подключать stdout и т.п.) | ||
+ | * Наследование может быть множественным (через запятую) | ||
+ | * Сначала идёт объявление объекта MyObj (между @interface ... @end). Затем блок реализации методов объекта (@implementation ... @end). Объявленный объект является наследником объекта Object (для iOS надо писать NSObject). Этот встроенный в язык объект имеет базовые функции управления памятью и т.п. | ||
+ | * Аналогично C++ можно управлять видимостью переменных (но не методов) при помощи вставки директив @private или @public | ||
+ | * id — это указатель на объект Objective-C. Это эквивалентно void* в C, к которому вы можете привести любой тип указателя на объект, а также привести его к любому другому типу указателя на объект. | ||
+ | * Отладочная функция NSLog(@"%s %@ %d", "aaa", @"bbb", 5); аналогична printf, но может принимать как С-строки, так и NSString. Кроме этого она выводит время и автоматом вставляет "\n". | ||
+ | |||
+ | == Наследование классов == | ||
+ | <pre class="brush:cpp; gutter: false;"> | ||
+ | #import <objc/objc.h> | ||
+ | #import <objc/Object.h> | ||
+ | |||
+ | @interface Class1 : Object { int var; } // класс из одной переменной | ||
+ | -(void) setVar : (int)v; // и метода её задания | ||
+ | @end | ||
+ | |||
+ | @implementation Class1 // имплементация класса Class1 | ||
+ | -(void) setVar: (int)v { var = v; } | ||
+ | @end | ||
+ | |||
+ | @interface Class2 : Class1 { } // Наследник данных и методов класса Class1 | ||
+ | -(void) print; // добавляет метод | ||
+ | @end | ||
+ | |||
+ | @implementation Class2 | ||
+ | -(void) print{ printf("var1 = %d", var);} // описывает его | ||
+ | @end | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | Class2 *c2 = [[Class2 alloc] init]; // создаем экземпляр класса | ||
+ | [c2 setVar : 5]; // доступен метод родителя | ||
+ | [c2 print]; // и добавленный наследником метод | ||
+ | return 0; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | == Строки - это объекты == | ||
+ | |||
+ | <pre class="brush:cpp; gutter: false;"> | ||
+ | NSString *string1 = @"String one"; // новая строка | ||
+ | NSString *string2 = [NSString stringWithString:string1]; // на её основе создаем еще одну | ||
+ | NSString *string3 = [[NSString alloc] initWithString:string1]; // выделяем память | ||
+ | [string3 release]; // освобождаем память | ||
+ | |||
+ | NSString *formatString = [NSString stringWithFormat:@"Строка (%@) имеет длину %i" , string1, string1.length]; | ||
+ | NSLog(@"%@",formatString); | ||
+ | |||
+ | NSString *lower = [@"LOWER CASE ME" lowercaseString]; // в нижний регистр | ||
+ | NSString *capitalize = [@"capitalize me" capitalizedString]; // в верхний регистр | ||
+ | |||
+ | NSString *students = @"Tom, Bill, Joe"; | ||
+ | NSArray *sArray = [students componentsSeparatedByString:@", "]; // разбиение на слова | ||
+ | NSLog(@"%@", sArray); | ||
+ | </pre> | ||
+ | |||
+ | == iPhone: Hello world == | ||
+ | |||
+ | см. [http://imaladec.com/story/hello_world]. | ||
+ | откройте файл HelloWorldViewController.m найдите метод viewDidLoad. Раскомментируйте его | ||
+ | и напишите: | ||
+ | <pre class="brush:cpp; gutter: false;"> | ||
+ | - (void)viewDidLoad | ||
+ | { | ||
+ | [super viewDidLoad]; | ||
+ | |||
+ | UILabel *helloWorld = [[UILabel alloc] initWithFrame:CGRectMake(100.0f, 100.0f, 100.0f, 20.0f)]; | ||
+ | helloWorld.backgroundColor = [UIColor clearColor]; | ||
+ | helloWorld.text = @"Hello world"; | ||
+ | [self.view addSubview:helloWorld]; | ||
+ | [helloWorld release]; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | == Файловая система iOS == | ||
+ | |||
+ | Приложение имеет доступ только к своей "песочнице". При этом, записывать или изменять файлы можно осуществить только в папке документов (Documents) конкретного приложения. Остальные файлы доступны только для чтения. |
Текущая версия на 13:26, 25 сентября 2011
Objective-C — это объектное расширение языка C. Каждая программа, написанная на C понимается и Objective-C (но естественно не наоборот). Новые ключевые слова в Objective-C начинаются с символа @. Кроме этого для вызов методов объектов используются сообщения заключенные в квадратные скобки: [object message];
[a doSomething]; // тоже, что a.doSomething(); в С++
Содержание
Пример
Ниже следующий пример можно откомпилировать online: http://ideone.com/
#import <objc/objc.h> #import <objc/Object.h> @interface MyObj : Object // Объявление интерфейсной части объекта MyObj { int num; } - (void) print; // void MyObj::print() - процедура - (int) getVal; // int MyObj::getVal() - функция - (void) setVal: (int) v; // void MyObj::getVal(int v) - функция с параметром - (int) calc:(int)x : (int)y; // int calc(int x, int y) @end @implementation MyObj // Описание методов объекта MyObj - (void) print { printf("num=%d\n", num); } - (int) getVal { return num; } - (void) setVal :(int) v { num = v; } - (int) calc :(int)x :(int)y { return x/y; } @end int main() { id obj = [[MyObj alloc] init]; [obj setVal: 5]; // obj.setVal(); printf("num =%d\n", [obj getVal]); // [...] возвращают значение ! printf("calc=%d\n", [obj calc: 6 : 3]); // obj.calc(6,3) [obj print]; // obj.print(); return 0; }
- Приставка у классов, функций и директив NS происходит от NextStep
- #import аналогичен #include, но включается в код один раз (не надо обкладывать defin-ами). Кроме этого подключаемая библиотека содержит множество модулей (т.е. не надо подключать stdout и т.п.)
- Наследование может быть множественным (через запятую)
- Сначала идёт объявление объекта MyObj (между @interface ... @end). Затем блок реализации методов объекта (@implementation ... @end). Объявленный объект является наследником объекта Object (для iOS надо писать NSObject). Этот встроенный в язык объект имеет базовые функции управления памятью и т.п.
- Аналогично C++ можно управлять видимостью переменных (но не методов) при помощи вставки директив @private или @public
- id — это указатель на объект Objective-C. Это эквивалентно void* в C, к которому вы можете привести любой тип указателя на объект, а также привести его к любому другому типу указателя на объект.
- Отладочная функция NSLog(@"%s %@ %d", "aaa", @"bbb", 5); аналогична printf, но может принимать как С-строки, так и NSString. Кроме этого она выводит время и автоматом вставляет "\n".
Наследование классов
#import <objc/objc.h> #import <objc/Object.h> @interface Class1 : Object { int var; } // класс из одной переменной -(void) setVar : (int)v; // и метода её задания @end @implementation Class1 // имплементация класса Class1 -(void) setVar: (int)v { var = v; } @end @interface Class2 : Class1 { } // Наследник данных и методов класса Class1 -(void) print; // добавляет метод @end @implementation Class2 -(void) print{ printf("var1 = %d", var);} // описывает его @end int main() { Class2 *c2 = [[Class2 alloc] init]; // создаем экземпляр класса [c2 setVar : 5]; // доступен метод родителя [c2 print]; // и добавленный наследником метод return 0; }
Строки - это объекты
NSString *string1 = @"String one"; // новая строка NSString *string2 = [NSString stringWithString:string1]; // на её основе создаем еще одну NSString *string3 = [[NSString alloc] initWithString:string1]; // выделяем память [string3 release]; // освобождаем память NSString *formatString = [NSString stringWithFormat:@"Строка (%@) имеет длину %i" , string1, string1.length]; NSLog(@"%@",formatString); NSString *lower = [@"LOWER CASE ME" lowercaseString]; // в нижний регистр NSString *capitalize = [@"capitalize me" capitalizedString]; // в верхний регистр NSString *students = @"Tom, Bill, Joe"; NSArray *sArray = [students componentsSeparatedByString:@", "]; // разбиение на слова NSLog(@"%@", sArray);
iPhone: Hello world
см. [1]. откройте файл HelloWorldViewController.m найдите метод viewDidLoad. Раскомментируйте его и напишите:
- (void)viewDidLoad { [super viewDidLoad]; UILabel *helloWorld = [[UILabel alloc] initWithFrame:CGRectMake(100.0f, 100.0f, 100.0f, 20.0f)]; helloWorld.backgroundColor = [UIColor clearColor]; helloWorld.text = @"Hello world"; [self.view addSubview:helloWorld]; [helloWorld release]; }
Файловая система iOS
Приложение имеет доступ только к своей "песочнице". При этом, записывать или изменять файлы можно осуществить только в папке документов (Documents) конкретного приложения. Остальные файлы доступны только для чтения.