My:Objective-C — различия между версиями

Материал из synset
Перейти к: навигация, поиск
(Пример)
 
(не показано 26 промежуточных версий этого же участника)
Строка 1: Строка 1:
Objective-C — это расширенный набор C. Каждая программа, написанная на C, является корректной программой Objective-C. Все новые ключевые слова в Objective-C начинаются с символа @, который не является корректным идентификатором 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
  
<pre class="brush:Obj-C; gutter: false;">
+
int main()
a.doSomething();  // С++
+
{
[a doSomething];   // Obj-C
+
  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) конкретного приложения. Остальные файлы доступны только для чтения.