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

Материал из synset
Перейти к: навигация, поиск
(Пример)
(Пример)
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
Objective-C — это расширенный набор C. Каждая программа, написанная на C, является корректной программой Objective-C. Все новые ключевые слова в Objective-C начинаются с символа @, который не является корректным идентификатором C. Кроме этого вызов методов объектов  
+
Objective-C — это объектное расширение языка C. Каждая программа, написанная на C понимается и Objective-C (но естественно не наоборот). Новые ключевые слова в Objective-C начинаются с символа @. Кроме этого для вызов методов объектов  
осуществляется при помощи сообщений <nowiki>[object message];</nowiki>
+
используются '''сообщения''' заключенные в квадратные скобки: <nowiki>[object message];</nowiki>
 
<pre class="brush:cpp; gutter: false;">  
 
<pre class="brush:cpp; gutter: false;">  
a.doSomething();   // С++
+
[a doSomething];  // тоже, что a.doSomething(); в С++
[a doSomething];  // Obj-C
 
 
</pre>
 
</pre>
 
== Пример ==
 
== Пример ==
Строка 38: Строка 37:
 
}
 
}
 
</pre>
 
</pre>
 +
* Приставка у классов, функций и директив NS происходит от NextStep
 +
* #import аналогичен #include, но включается в код один раз (не надо обкладывать defin-ами). Кроме этого подключаемая библиотека содержит множество модулей (т.е. не надо подключать stdout и т.п.)
 +
* Наследование может быть множественным (через запятую)
 
* Сначала идёт объявление объекта MyObj (между @interface ... @end). Затем блок реализации методов объекта (@implementation ... @end). Объявленный объект является наследником объекта Object (для iOS надо писать  NSObject). Этот встроенный в язык объект имеет базовые функции управления памятью и т.п.
 
* Сначала идёт объявление объекта MyObj (между @interface ... @end). Затем блок реализации методов объекта (@implementation ... @end). Объявленный объект является наследником объекта Object (для iOS надо писать  NSObject). Этот встроенный в язык объект имеет базовые функции управления памятью и т.п.
* Аналогично C++ можно управлять видимостью переменных при помощи вставки директив @private или @public
+
* Аналогично C++ можно управлять видимостью переменных (но не методов) при помощи вставки директив @private или @public
 
 
* id — это указатель на объект Objective-C. Это эквивалентно void* в C, к которому вы можете привести любой тип указателя на объект, а также привести его к любому другому типу указателя на объект.
 
* id — это указатель на объект Objective-C. Это эквивалентно void* в C, к которому вы можете привести любой тип указателя на объект, а также привести его к любому другому типу указателя на объект.
 +
* Отладочная функция NSLog(@"%s %@ %d", "aaa", @"bbb", 5); аналогична printf, но может принимать как С-строки, так и NSString.  Кроме этого она выводит время и автоматом вставляет "\n".
  
 
== Наследование классов ==
 
== Наследование классов ==
'''Class1.h:'''
 
 
<pre class="brush:cpp; gutter: false;">  
 
<pre class="brush:cpp; gutter: false;">  
#import <Foundation/Foundation.h>
+
#import <objc/objc.h>
@interface Class1 : NSObject {
+
#import <objc/Object.h>
    int var1;
+
 
}
+
@interface Class1 : Object { int var; } // класс из одной переменной
-(void) setVariable;
+
-(void) setVar : (int)v;                 // и метода её задания
 
@end
 
@end
</pre>
+
 
'''Class1.m:'''
+
@implementation Class1                  // имплементация класса Class1
<pre class="brush:cpp; gutter: false;">
+
-(void) setVar: (int)v { var = v; }  
#import "Class1.h"
 
@implementation Class1
 
-(void) setVariable{ var1 = 5; }
 
 
@end
 
@end
</pre>
+
 
'''Class2.h''':
+
@interface Class2 : Class1 {    }         // Наследник данных и методов класса Class1
<pre class="brush:cpp; gutter: false;">
+
-(void) print;                           // добавляет метод
#import <Foundation/Foundation.h>
 
#import "Class1.h"
 
@interface Class2 : Class1 {     
 
}
 
-(void) printVariable;
 
 
@end
 
@end
</pre>
+
 
'''Class2.m''':
 
<pre class="brush:cpp; gutter: false;">
 
#import "Class2.h"
 
 
@implementation Class2
 
@implementation Class2
-(void) printVariable{ NSLog(@"var1 = %d", var1); }
+
-(void) print{ printf("var1 = %d", var);} // описывает его
 
@end
 
@end
</pre>
+
 
Используем классы:
+
int main()
<pre class="brush:cpp; gutter: false;">
+
{
Class2 *cl2 = [[Class2 alloc] init];    // создаем экземпляр класса  
+
  Class2 *c2 = [[Class2 alloc] init];    // создаем экземпляр класса  
[cl2 setVariable];                    
+
  [c2 setVar : 5];                       // доступен метод родителя
[cl2 printVariable];
+
  [c2 print];                           // и добавленный наследником метод
[cl2 release];
+
  return 0;
 +
}
 
</pre>
 
</pre>
  

Текущая версия на 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) конкретного приложения. Остальные файлы доступны только для чтения.