![Page 1: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/1.jpg)
Objective-C
Разработка приложений для iOS
Лекция 1
Глеб Тарасов
![Page 2: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/2.jpg)
Мобильная разработка, что изменилось?
![Page 3: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/3.jpg)
![Page 4: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/4.jpg)
![Page 5: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/5.jpg)
![Page 6: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/6.jpg)
![Page 7: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/7.jpg)
Особенности
• Высокие ожидания пользователей• Другие паттерны использования
• Маленький экран• Слабый процессор, мало памяти• Медленный интернет• Управление жестами
![Page 8: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/8.jpg)
Почему iOS?
![Page 9: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/9.jpg)
![Page 10: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/10.jpg)
Разработка под iOS
![Page 11: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/11.jpg)
XCode
![Page 12: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/12.jpg)
Mac OS Lion
![Page 13: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/13.jpg)
Как запустить Mac OS?
•Компьютер Mac
•Hacintosh
•Виртуалка (VMWare, VirtualBox)
![Page 14: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/14.jpg)
Apple Developer Program
$99
• Отладка на устройстве• Выпуск в AppStore
![Page 15: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/15.jpg)
Objective-C
![Page 16: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/16.jpg)
История1981 — Object-Oriented Pre-Compiler (OOPC). Компания StepStone. Tom Love & Brad Cox
1996 — Apple покупает NeXT. Objective-C — основной язык для Mac OS.
1988 — NeXT лицензирует Objective-C
1986 — Objective-C. «Object-Oriented Programming, An Evolutionary Approach» (Brad Cox).
2007 — Objective-C — основной язык для iPhone OS
![Page 17: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/17.jpg)
Основные особенности
• объектно-ориентированный• компилируется в машинный код• полностью совместим с Си
• слабо-типизированный• управление памятью основано на счетчике ссылок
![Page 18: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/18.jpg)
Сначала немного Си
http://ru.wikipedia.org/wiki/Си_(язык_программирования)
![Page 19: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/19.jpg)
Указателиint main(int argc, const char * argv[]){ int a = 5; int *b = &a; *b = 7; printf("%d", a);}
7
![Page 20: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/20.jpg)
double add(double a, double b){ return a + b;}
int main(int argc, const char * argv[]){ double a = 5.5; double b = 7; double *arr = malloc(2 * sizeof(double)); arr[0] = a; arr[1] = b; printf("array [0] = %g, [1] = %g, add = %g", arr[0], arr[1], add(arr[0], arr[1])); free(arr);}
Функции
![Page 21: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/21.jpg)
Структурыtypedef struct{ float x; float y;} Location;
double add(double a, double b){ return a + b;}
Location createLocation(float x, float y){ Location l; l.x = x; l.y = y; return l;}
int main(int argc, const char * argv[]){ Location l = createLocation(1.5, 0.5); printf("location: {%g, %g}", l.x, l.y);}
![Page 22: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/22.jpg)
Перечисленияtypedef enum { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear} UIViewAnimationCurve;
UIViewAnimationCurve a = UIViewAnimationCurveLinear;printf("%d", a);
![Page 23: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/23.jpg)
ПамятьКучаСтек
{ int a = 10;}{ int a = 20;}
int *a = malloc(sizeof(int) * 10);
free(a);
![Page 24: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/24.jpg)
Теперь немного ООП
http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
![Page 25: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/25.jpg)
Класс - описание внутреннего состояния + методов изменения этого состояния
Объект - экземпляр класса
Поля - состояние объекта
Методы - изменение состояния объекта
![Page 26: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/26.jpg)
Класс «Работник»
- имя (строка)- возраст (целое)- пол (м/ж)- время_поступления_на_работу (дата)- время_увольнения (дата)- подчиненные (массив работников)
- уволить()- добавить подчиненного(работник)
Поля:
Методы:
![Page 27: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/27.jpg)
НаследованиеКласс «Руководитель» (наследуется от «Работник»)
- подчиненные (массив работников)
- добавить подчиненного(работник)
Поля:
Методы:
![Page 28: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/28.jpg)
Objective-C
![Page 29: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/29.jpg)
NSString *a = [[NSString alloc] init];
NSString *b = [a copy];
[b stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *c = @"string";
[c stringByPaddingToLength:20 withString:@" " startingAtIndex:0];
Синтаксис
![Page 30: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/30.jpg)
nil
• аналог null из других языков
• можно вызывать любой метод, не будет исключения
• если метод возвращает объект - вернется nil
• если метод возвращает число - вернется 0• если метод возвращает структуру - результат не определен
![Page 31: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/31.jpg)
nil
NSString *a = nil;int length = [a length]; // 0NSString *m = [a mutableCopy]; // nilNSRange range = [a rangeOfString:@"a"]; // undefined!!!if (a) // if (a != nil){ NSRange r = [a rangeOfString:@"a"];}
![Page 32: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/32.jpg)
BOOL
BOOL a = YES;if (a) // if (a == YES){ BOOL b = [c isEqual:d]; if (!b) // if (a == NO) { //blabla }}
![Page 33: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/33.jpg)
ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;
![Page 34: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/34.jpg)
СтруктурыCGPoint p;p.x = 10;p.y = 20;p = CGPointMake(10, 20);
CGSize s;s.width = 100;s.height = 100;s = CGSizeMake(100, 100);
CGRect r;r.size = s;r.origin = p;r = CGRectMake(10, 20, 100, 100);
![Page 35: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/35.jpg)
Стандартные классы
![Page 36: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/36.jpg)
Строки
NSString NSMutableString
NSString *a = @"abc";NSString *b = [a stringByReplacingOccurrencesOfString:@"a" withString:@"b"];NSLog(@"b: %@", b);
NSMutableString *m = [b mutableCopy];NSRange r;r.length = m.length;r.location = 0;[m replaceOccurrencesOfString:@"c" withString:@"b" options:0 range:r];NSLog(@"m: %@", m);
![Page 37: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/37.jpg)
Списки
NSArray NSMutableArray
NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];NSString *first = [a objectAtIndex:0];NSString *last = [a objectAtIndex:[a count] - 1];
NSMutableArray *b = [a mutableCopy];[b addObject:@"r"];[b replaceObjectAtIndex:1 withObject:@"q"];[b removeObjectAtIndex:2];
Обычные упорядоченные массивы
![Page 38: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/38.jpg)
Словари
NSDictionary NSMutableDictionary
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"a", @"key1", @"b", @"key2", nil];NSString *first = [dict objectForKey:@"key1"];
NSMutableDictionary *m = [dict mutableCopy];[m setObject:@"c" forKey:@"key3"];[m setObject:@"aa" forKey:@"key1"];NSLog(@"m: %@", m);
Хранение пар «ключ-значение».Быстрый поиск значения по ключу
![Page 39: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/39.jpg)
Множества
NSSet NSMutableSet
NSSet *s = [NSSet setWithObjects:@"a", @"b", @"c", nil];BOOL c = [s containsObject:@"b"];
NSMutableSet *m = [s mutableCopy];[m addObject:@"d"];[m removeObject:@"a"];
Неупорядоченная коллекция. Быстрая проверка на contains
![Page 40: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/40.jpg)
Перечисление (enumeration)NSArray *arr = [NSArray arrayWithObjects: @"a", @"b", @"c", nil];
for (NSString *a in arr) { NSLog(@"%@", a);}
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"a", @"key1", @"b", @"key2", nil];
for (NSString *key in dict){ NSString *value = [dict objectForKey:key]; NSLog(@"%@ - %@", key, value);}
![Page 41: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/41.jpg)
ЧислаNSNumber
NSNumber *a = [NSNumber numberWithInt:3];int b = [a intValue];
NSNumber *c = [NSNumber numberWithFloat:2.5f];float d = [c floatValue];
NSNumber *e = [NSNumber numberWithDouble:3.567];double f = [e doubleValue];
if ([a isEqualToNumber:c]) NSLog(@"equals");
![Page 42: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/42.jpg)
Бинарные данные
NSData NSMutableData
NSData *data = [[NSData alloc] initWithContentsOfFile:@"data.txt"];NSInteger length = [data length];[data writeToFile:@"result.txt" atomically:YES]; NSMutableData *m = [data mutableCopy];[m appendData:data];
Хранение картинок, текстовых данных в бинарном виде и т.д.
![Page 43: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/43.jpg)
NSNull
NSMutableArray *a = [[NSMutableArray alloc] init];[a addObject:[NSNull null]];
NSObject *q = [a lastObject];if (q == [NSNull null]){ //bla bla}
сохранять «пусто» в массивы и словари
![Page 44: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/44.jpg)
NSValue
CGPoint p = CGPointMake(10, 20);CGRect r = CGRectMake(10, 20, 30, 40);NSValue *v1 = [NSValue valueWithCGPoint:p];NSValue *v2 = [NSValue valueWithCGRect:r];
NSArray *arr = [NSArray arrayWithObjects:v1, v2, nil];CGRect r2 = [[arr lastObject] CGRectValue];
преобразовывать структуры и другие «не объекты» в объекты
![Page 45: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/45.jpg)
Dot notationКласс Rectangle
- float width (число)- float height (число)- Location location (структура)
Rectangle *r = [[Rectangle alloc] init];[r setWidth:10];[r setHeight:20];
Location l;l.x = 1;l.y = 2;
[r setLocation:l];
NSLog(@"%g, %g, (%g, %g)", [r width], [r height], [r location].x, [r location].y);
![Page 46: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/46.jpg)
Dot notation
Rectangle *r = [[Rectangle alloc] init];r.width = 10;r.height = 20;Location l = {1, 2};r.location = l;
NSLog(@"%g, %g, (%g, %g)", r.width, r.height, r.location.x, r.location.y);
![Page 47: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/47.jpg)
Собственные классы
![Page 48: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/48.jpg)
Собственные классы
User.h
![Page 49: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/49.jpg)
Собственные классы@interface User
@end
User.h
![Page 50: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/50.jpg)
Собственные классы@interface User
@end
User.h
: NSObject
![Page 51: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/51.jpg)
Собственные классы@interface User
@end
User.h
{ NSString *_name;}
: NSObject
![Page 52: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/52.jpg)
Собственные классы@interface User
@end
User.h
{ NSString *_name;}
- (void)setName:(NSString *)name;- (NSString *)name;
: NSObject
![Page 53: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/53.jpg)
Собственные классы@interface User
@end
User.h
User.m
{ NSString *_name;}
- (void)setName:(NSString *)name;- (NSString *)name;
: NSObject
![Page 54: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/54.jpg)
Собственные классы@interface User
@end
@implementation User
@end
User.h
User.m
{ NSString *_name;}
- (void)setName:(NSString *)name;- (NSString *)name;
: NSObject
![Page 55: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/55.jpg)
Собственные классы@interface User
@end
@implementation User
@end
User.h
User.m
{ NSString *_name;}
- (void)setName:(NSString *)name;- (NSString *)name;
- (void)setName:(NSString *)name{ _name = name; }
- (NSString *)name{ return _name;}
: NSObject
![Page 56: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/56.jpg)
User.h
![Page 57: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/57.jpg)
User.h#import <Foundation/Foundation.h>
![Page 58: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/58.jpg)
User.h@interface User
@end
#import <Foundation/Foundation.h>
![Page 59: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/59.jpg)
User.h@interface User
@end
#import <Foundation/Foundation.h>
: NSObject
![Page 60: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/60.jpg)
User.h@interface User
@end
#import <Foundation/Foundation.h>
: NSObject
{ NSInteger _age;}
![Page 61: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/61.jpg)
User.h@interface User
@end
#import <Foundation/Foundation.h>
@property(nonatomic, strong) NSString *name;
@property(nonatomic) NSInteger age;
: NSObject
{ NSInteger _age;}
![Page 62: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/62.jpg)
User.h@interface User
@end
#import <Foundation/Foundation.h>
@property(nonatomic, strong) NSString *name;
@property(nonatomic) NSInteger age;
- (void)setAge:(NSInteger)age;- (NSInteger)age;
: NSObject
{ NSInteger _age;}
![Page 63: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/63.jpg)
User.h@interface User
@end
#import <Foundation/Foundation.h>
@property(nonatomic, strong) NSString *name;
@property(nonatomic) NSInteger age;
- (void)deleteProfile;
- (void)setAge:(NSInteger)age;- (NSInteger)age;
: NSObject
{ NSInteger _age;}
![Page 64: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/64.jpg)
User.h@interface User
@end
- (void)postCommentWithText:(NSString *)text;
- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;
#import <Foundation/Foundation.h>
@property(nonatomic, strong) NSString *name;
@property(nonatomic) NSInteger age;
- (void)deleteProfile;
- (void)setAge:(NSInteger)age;- (NSInteger)age;
: NSObject
{ NSInteger _age;}
![Page 65: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/65.jpg)
User.m
![Page 66: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/66.jpg)
User.m#import "User.h"
@implementation User
@end
![Page 67: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/67.jpg)
User.m#import "User.h"
@implementation User
@end
@synthesize age = _age;@synthesize name = _name;
![Page 68: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/68.jpg)
User.m#import "User.h"
@implementation User
@end
@synthesize age = _age;@synthesize name = _name;
- (void)setAge:(NSInteger)age{ _age = age; NSLog(@"Установили возраст %d", age);}
![Page 69: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/69.jpg)
User.m#import "User.h"
@implementation User
@end
- (void)deleteProfile{ // удаляем из базы NSString *name = [self name]; NSLog(@"Пользователь %@ удален", name);}
- (void)postCommentWithText:(NSString *)text{ [self postCommentWithTopic:@"" andText:text];}
- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text{ NSLog(@"Пользователь %@ (возраст: %d) с темой %@", self.name, self.age, topic);}
@synthesize age = _age;@synthesize name = _name;
- (void)setAge:(NSInteger)age{ _age = age; NSLog(@"Установили возраст %d", age);}
![Page 70: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/70.jpg)
Admin.h
![Page 71: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/71.jpg)
Admin.h#import "User.h"
@interface Admin : User
- (void)deleteComment:(NSInteger)key;
@end
![Page 72: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/72.jpg)
Admin.h#import "User.h"
@interface Admin : User
- (void)deleteComment:(NSInteger)key;
@end
Admin.m
![Page 73: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/73.jpg)
Admin.h#import "User.h"
@interface Admin : User
- (void)deleteComment:(NSInteger)key;
@end
Admin.m#import "Admin.h"
@implementation Admin
- (void)deleteComment:(NSInteger)key{ //удаляем из базы NSLog(@"Комментарий с ключом %d удален", key); // оставляем комментарий, об удалении [self postCommentWithTopic:@"От админа" andText:@"Удалил коммент за хамство"];}
@end
![Page 74: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/74.jpg)
Инициализация объектов
![Page 75: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/75.jpg)
Инициализация объектов
User *user = [[User alloc] init];
![Page 76: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/76.jpg)
Инициализация объектов
User *user = [[User alloc] init];
user.age = 34;[user setName:@"UserName"];
![Page 77: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/77.jpg)
Инициализация объектов
NSString *comment = @"БлаБлаБла";
[user postCommentWithText:comment]; [user deleteProfile];
User *user = [[User alloc] init];
user.age = 34;[user setName:@"UserName"];
![Page 78: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/78.jpg)
Собственный инициализатор
![Page 79: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/79.jpg)
Собственный инициализатор
- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}
![Page 80: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/80.jpg)
Собственный инициализатор
- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}
- (id)init{ return [self initWithName:@"Имя по умолчанию"];}
![Page 81: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/81.jpg)
Методы класса
![Page 82: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/82.jpg)
Методы классаВ файле Admin.h:
![Page 83: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/83.jpg)
Методы класса
+ (Admin *)createAdmin;
В файле Admin.h:
![Page 84: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/84.jpg)
Методы класса
+ (Admin *)createAdmin;
В файле Admin.h:
В файле Admin.m:
![Page 85: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/85.jpg)
Методы класса
+ (Admin *)createAdmin;
+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}
В файле Admin.h:
В файле Admin.m:
![Page 86: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/86.jpg)
Методы класса
+ (Admin *)createAdmin;
+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}
В файле Admin.h:
В файле Admin.m:
Использование:
![Page 87: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/87.jpg)
Методы класса
+ (Admin *)createAdmin;
+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}
В файле Admin.h:
В файле Admin.m:
Использование:
Admin *admin = [Admin createAdmin]; [admin deleteComment:10];
![Page 88: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/88.jpg)
Тип id
![Page 89: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/89.jpg)
Селекторы
NSString *a = @"a";id b = a;if ([b respondsToSelector:@selector(isEqualToString:)]){@ BOOL e = [b isEqualToString:@"a"];}
SEL s = @selector(removeAllObjects);NSMutableArray *arr = ...;[arr performSelector:s];[arr makeObjectsPerformSelector:s]
![Page 90: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/90.jpg)
Классы
NSString *a = @"a";id b = a;if ([b isKindOfClass:[NSString class]]){@ BOOL e = [b isEqualToString:@"a"];}
![Page 91: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/91.jpg)
Протоколы
![Page 92: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/92.jpg)
Протоколы@protocol SendMessageProtocol
- (void)sendMessage:(NSString *)message;
@end
![Page 93: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/93.jpg)
Протоколы@protocol SendMessageProtocol
- (void)sendMessage:(NSString *)message;
@end
@interface User : NSObject<SendMessageProtocol>
@end
![Page 94: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/94.jpg)
Протоколы@protocol SendMessageProtocol
- (void)sendMessage:(NSString *)message;
@end
@interface User : NSObject<SendMessageProtocol>
@end
@implementation User
- (void)sendMessage:(NSString *)message{ // send message}
@end
![Page 95: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/95.jpg)
Протоколы@protocol SendMessageProtocol
- (void)sendMessage:(NSString *)message;
@end
@interface User : NSObject<SendMessageProtocol>
@end
@implementation User
- (void)sendMessage:(NSString *)message{ // send message}
@end
id<SendMessageProtocol> sender = [[User alloc] init];[sender sendMessage:@"message"];
![Page 96: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/96.jpg)
Категории
![Page 97: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/97.jpg)
Категории@interface NSString(User)
- (User *)userWithName;
@end
![Page 98: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/98.jpg)
Категории@interface NSString(User)
- (User *)userWithName;
@end
@implementation NSString(User)
- (User *)userWithName{ User *result = [[User alloc] init]; result.name = self; return result;}
@end
![Page 99: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/99.jpg)
Категории@interface NSString(User)
- (User *)userWithName;
@end
@implementation NSString(User)
- (User *)userWithName{ User *result = [[User alloc] init]; result.name = self; return result;}
@end
User *test = [@"Username" userWithName];
![Page 100: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/100.jpg)
Память
retain/release ARC
![Page 101: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/101.jpg)
retainCountNSMutableString *a = [[NSMutableString alloc] init];NSLog(@"%d", [a retainCount]);[a appendString:@"a"];[a retain];NSLog(@"%d", [a retainCount]);[a release];NSLog(@"%d", [a retainCount]);[a release];
1
2
1dealloc
![Page 102: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/102.jpg)
retain setter
- (void)setName:(NSString *)name{ NSString *prev = _name; _name = name; [_name retain]; [prev release];}
- (void)dealloc{ [super dealloc]; [_name release];}
![Page 103: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/103.jpg)
autorelease- (NSString *)fullName{ NSMutableString *s = [[NSMutableString alloc] init]; [s appendString:[self name]]; [s appendString:@" "]; [s appendString:[self secondName]]; return [s autorelease];}
- (void)main{ NSString *name = [self fullName]; NSLog(@"%@", name);}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
... [pool drain];
![Page 104: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/104.jpg)
retain/release• после init счетчик ссылок равен 1
• когда объекту изменяют внутреннее поле через retain-setter: retain новому значению, release старому
• когда в массив или словарь добавляют элемент - ему retain
• когда удаляют элемент - release ему
![Page 105: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/105.jpg)
ARC
• автоматически генерится dealloc
• автоматический retain/release при присваивании полей
• автоматический retain и autorelease для возвращаемого значения из метода
• автоматический release для локальной переменной при завершении области видимости
retain release autorelease [super dealloc]
![Page 106: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/106.jpg)
ARC
NSString *a = [[NSString alloc] init];NSLog(@"%@", a);
release
- (void)setName:(NSString *)name{ _name = name;} retain
release- (void)dealloc{ NSLog(@"dealloc");}
[super dealloc];release всех полей
![Page 107: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/107.jpg)
Цикл ссылок
CarNSArray *_wheels
WheelCar *car
Car *car = [[[Car alloc] init] autorelease];Wheel *wheel = [[[Wheel alloc] init] autorelease];
[wheel setCar:car];[car addWheel:wheel]; retainCount = 2
после autorelease будет retainCount = 1
![Page 108: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/108.jpg)
Модификаторы• strong
• weak
• unsafe_unretained
• copy@interface Car : NSObject
@property(strong, nonatomic) NSArray *wheels;
@end
@interface Wheel : NSObject
@property(weak, nonatomic) Car *car;
@end
![Page 109: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/109.jpg)
Objective-C style guide• Локальные переменные: myLocalVariable
• Свойства: myProperty
• Классы: MyClass
• Методы: doSomethingWith:
• Внутренние переменные: • _myLocal
• myLocal_
• myLocal
![Page 110: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/110.jpg)
Демонстрация
![Page 111: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/111.jpg)
Вопросы на засыпку
Какой метод управления памятью используется в языке Си?
А в Objective-C?
![Page 112: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/112.jpg)
Чем отличаются строки "string1" и @"string2"
![Page 113: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/113.jpg)
Как сохранить число 5 в массив?
![Page 114: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/114.jpg)
Как создать объект?
![Page 115: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C](https://reader035.vdocuments.pub/reader035/viewer/2022081800/54bb883d4a7959372d8b45c3/html5/thumbnails/115.jpg)
Что такое «strong» и «weak»?
Чем они отличаются?