My:Objective-C — различия между версиями
WikiSysop (обсуждение | вклад) |
WikiSysop (обсуждение | вклад) (→Пример) |
||
(не показано 13 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | Objective-C — это | + | Objective-C — это объектное расширение языка C. Каждая программа, написанная на C понимается и Objective-C (но естественно не наоборот). Новые ключевые слова в Objective-C начинаются с символа @. Кроме этого для вызов методов объектов |
− | + | используются '''сообщения''' заключенные в квадратные скобки: <nowiki>[object message];</nowiki> | |
<pre class="brush:cpp; gutter: false;"> | <pre class="brush:cpp; gutter: false;"> | ||
− | a.doSomething(); | + | [a doSomething]; // тоже, что a.doSomething(); в С++ |
− | |||
</pre> | </pre> | ||
− | + | == Пример == | |
+ | Ниже следующий пример можно откомпилировать online: http://ideone.com/ | ||
<pre class="brush:cpp; gutter: false;"> | <pre class="brush:cpp; gutter: false;"> | ||
− | @interface | + | #import <objc/objc.h> |
+ | #import <objc/Object.h> | ||
+ | |||
+ | @interface MyObj : Object // Объявление интерфейсной части объекта MyObj | ||
{ | { | ||
− | + | int num; | |
− | |||
− | |||
− | |||
} | } | ||
− | + | - (void) print; // void MyObj::print() - процедура | |
− | - (void) | + | - (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 |
− | - (void) | + | |
− | - (void) | + | @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 | @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 | |
− | id — это указатель на объект Objective-C. Это эквивалентно void* в C, к которому вы можете привести любой тип указателя на объект, а также привести его к любому другому типу указателя на объект. | + | * #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;"> | <pre class="brush:cpp; gutter: false;"> | ||
− | #import < | + | #import <objc/objc.h> |
− | @interface Class1 : | + | #import <objc/Object.h> |
− | + | ||
− | } | + | @interface Class1 : Object { int var; } // класс из одной переменной |
− | -(void) | + | -(void) setVar : (int)v; // и метода её задания |
@end | @end | ||
− | + | ||
− | + | @implementation Class1 // имплементация класса Class1 | |
− | + | -(void) setVar: (int)v { var = v; } | |
− | |||
− | @implementation Class1 | ||
− | -(void) | ||
@end | @end | ||
− | + | ||
− | + | @interface Class2 : Class1 { } // Наследник данных и методов класса Class1 | |
− | + | -(void) print; // добавляет метод | |
− | |||
− | |||
− | @interface Class2 : Class1 { | ||
− | } | ||
− | -(void) | ||
@end | @end | ||
− | + | ||
− | |||
− | |||
− | |||
@implementation Class2 | @implementation Class2 | ||
− | -(void) | + | -(void) print{ printf("var1 = %d", var);} // описывает его |
@end | @end | ||
− | + | ||
− | + | int main() | |
− | + | { | |
− | Class2 * | + | Class2 *c2 = [[Class2 alloc] init]; // создаем экземпляр класса |
− | [ | + | [c2 setVar : 5]; // доступен метод родителя |
− | [ | + | [c2 print]; // и добавленный наследником метод |
− | + | return 0; | |
+ | } | ||
</pre> | </pre> | ||
Строка 104: | Строка 111: | ||
} | } | ||
</pre> | </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) конкретного приложения. Остальные файлы доступны только для чтения.