Разработка приложений для iOS          Лекция 1   Objective-C                            Глеб Тарасов
Мобильная разработка, что      изменилось?
Особенности• Высокие ожидания пользователей• Другие паттерны использования• Маленький экран• Слабый процессор, мало памяти...
Почему iOS?
Разработка под iOS
XCode
Mac OS Lion
Как запустить Mac OS?•Компьютер Mac• Hacintosh• Виртуалка (VMWare,VirtualBox)
Apple Developer         Program                          $99• Отладка на устройстве• Выпуск в AppStore
Objective-C
История1981 — Object-Oriented Pre-Compiler (OOPC).Компания StepStone. Tom Love & Brad Cox1986 — Objective-C. «Object-Orien...
Основные особенности• объектно-ориентированный• компилируется в машинный код• полностью совместим с Си• слабо-типизированн...
Сначала немного Сиhttp://ru.wikipedia.org/wiki/Си_(язык_программирования)
Указателиint main(int argc, const char * argv[]){    int a = 5;    int *b = &a;    *b = 7;    printf("%d", a);}           ...
Функцииdouble add(double a, double b){    return a + b;}int main(int argc, const char * argv[]){    double a = 5.5;    dou...
typedef struct{                    Структуры    float x;    float y;} Location;double add(double a, double b){    return a...
Перечисленияtypedef enum {    UIViewAnimationCurveEaseInOut,    UIViewAnimationCurveEaseIn,    UIViewAnimationCurveEaseOut...
Память    Стек                            Куча{                    int *a = malloc(sizeof(int) * 10);    int a = 10;}     ...
Теперь немного ООПhttp://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
Класс - описание внутреннего состояния + методовизменения этого состоянияОбъект - экземпляр классаПоля - состояние объекта...
Класс «Работник» Поля:- имя (строка)- возраст (целое)- пол (м/ж)- время_поступления_на_работу (дата)- время_увольнения (да...
НаследованиеКласс «Руководитель» (наследуется от«Работник»)   Поля: - подчиненные (массив работников)  Методы: - добавить ...
Objective-C
СинтаксисNSString *a = [[NSString alloc] init];NSString *b = [a copy];NSString *c = @"string";[b stringByReplacingOccurren...
nil• аналог null из других языков• можно вызывать любой метод, не будет  исключения• если метод возвращает объект - вернет...
nilNSString *a = nil;int length = [a length]; // 0NSString *m = [a mutableCopy]; // nilNSRange range = [a rangeOfString:@"...
BOOLBOOL a = YES;if (a) // if (a == YES){    BOOL b = [c isEqual:d];    if (!b) // if (a == NO)    {        //blabla    }}
ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;
СтруктурыCGPoint p;p.x = 10;p.y = 20;p = CGPointMake(10, 20);CGSize s;s.width = 100;s.height = 100;s = CGSizeMake(100, 100...
Стандартные классы
Строки        NSString                    NSMutableStringNSString *a = @"abc";NSString *b = [a stringByReplacingOccurrence...
Списки         NSArray                   NSMutableArray           Обычные упорядоченные массивыNSArray *a = [NSArray array...
Словари      NSDictionary                NSMutableDictionary            Хранение пар «ключ-значение».           Быстрый по...
Множества          NSSet                      NSMutableSet             Неупорядоченная коллекция.             Быстрая пров...
Перечисление (enumeration)NSArray *arr = [NSArray arrayWithObjects:              @"a",              @"b",              @"c...
Числа                  NSNumberNSNumber *a = [NSNumber numberWithInt:3];int b = [a intValue];NSNumber *c = [NSNumber numbe...
Бинарные данные         NSData                          NSMutableData            Хранение картинок, текстовых            д...
NSNull     сохранять «пусто» в массивы и словариNSMutableArray *a = [[NSMutableArray alloc] init];[a addObject:[NSNull nul...
NSValue        преобразовывать структуры и другие             «не объекты» в объектыCGPoint p = CGPointMake(10, 20);CGRect...
Dot notationКласс Rectangle    - float width (число)    - float height (число)    - Location location (структура)Rectangle *...
Dot notationRectangle *r = [[Rectangle alloc] init];r.width = 10;r.height = 20;Location l = {1, 2};r.location = l;NSLog(@"...
Собственные классы
Собственные классы               User.h
Собственные классы@interface User                          User.h@end
Собственные классы@interface User : NSObject                             User.h@end
Собственные классы@interface User : NSObject{       NSString *_name;}                             User.h@end
Собственные классы@interface User : NSObject{       NSString *_name;}- (void)setName:(NSString *)name;   User.h- (NSString...
Собственные классы@interface User : NSObject{       NSString *_name;}- (void)setName:(NSString *)name;   User.h- (NSString...
Собственные классы@interface User : NSObject{       NSString *_name;}- (void)setName:(NSString *)name;   User.h- (NSString...
Собственные классы@interface User : NSObject{       NSString *_name;}- (void)setName:(NSString *)name;   User.h- (NSString...
User.h
User.h#import <Foundation/Foundation.h>
User.h#import <Foundation/Foundation.h>@interface User@end
User.h#import <Foundation/Foundation.h>@interface User : NSObject@end
User.h#import <Foundation/Foundation.h>@interface User : NSObject{       NSInteger _age;}@end
User.h#import <Foundation/Foundation.h>@interface User : NSObject{       NSInteger _age;}@property(nonatomic, strong) NSSt...
User.h#import <Foundation/Foundation.h>@interface User : NSObject{       NSInteger _age;}@property(nonatomic, strong) NSSt...
User.h#import <Foundation/Foundation.h>@interface User : NSObject{       NSInteger _age;}@property(nonatomic, strong) NSSt...
User.h#import <Foundation/Foundation.h>@interface User : NSObject{       NSInteger _age;}@property(nonatomic, strong) NSSt...
User.m
#import "User.h"@implementation User                       User.m@end
#import "User.h"@implementation User                            User.m@synthesize age = _age;@synthesize name = _name;@end
#import "User.h"@implementation User                            User.m@synthesize age = _age;@synthesize name = _name;- (v...
#import "User.h"@implementation User                            User.m@synthesize age = _age;@synthesize name = _name;- (v...
Admin.h
Admin.h#import "User.h"@interface Admin : User- (void)deleteComment:(NSInteger)key;@end
Admin.h#import "User.h"@interface Admin : User- (void)deleteComment:(NSInteger)key;@endAdmin.m
Admin.h#import "User.h"@interface Admin : User- (void)deleteComment:(NSInteger)key;@endAdmin.m#import "Admin.h"@implementa...
Инициализация объектов
Инициализация объектовUser *user = [[User alloc] init];
Инициализация объектовUser *user = [[User alloc] init];user.age = 34;[user setName:@"UserName"];
Инициализация объектовUser *user = [[User alloc] init];user.age = 34;[user setName:@"UserName"];NSString *comment = @"БлаБ...
Собственный инициализатор
Собственный инициализатор- (id)initWithName:(NSString *)name{    self = [super init];    if (self)    {        self.name =...
Собственный инициализатор- (id)initWithName:(NSString *)name{    self = [super init];    if (self)    {        self.name =...
Методы класса
Методы классаВ файле Admin.h:
Методы классаВ файле Admin.h:+ (Admin *)createAdmin;
Методы классаВ файле Admin.h:+ (Admin *)createAdmin;В файле Admin.m:
Методы классаВ файле Admin.h:+ (Admin *)createAdmin;В файле Admin.m:+ (Admin *)createAdmin{    Admin *admin = [[Admin allo...
Методы классаВ файле Admin.h:+ (Admin *)createAdmin;В файле Admin.m:+ (Admin *)createAdmin{    Admin *admin = [[Admin allo...
Методы класса В файле Admin.h: + (Admin *)createAdmin; В файле Admin.m:+ (Admin *)createAdmin{    Admin *admin = [[Admin a...
Тип id
СелекторыNSString *a = @"a";id b = a;if ([b respondsToSelector:@selector(isEqualToString:)]){@ BOOL e = [b isEqualToString...
КлассыNSString *a = @"a";id b = a;if ([b isKindOfClass:[NSString class]]){@ BOOL e = [b isEqualToString:@"a"];}
Протоколы
Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end
Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end@interface User : NSObject<SendMessagePr...
Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end@interface User : NSObject<SendMessagePr...
Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end@interface User : NSObject<SendMessagePr...
Категории
Категории@interface NSString(User)- (User *)userWithName;@end
Категории@interface NSString(User)- (User *)userWithName;@end@implementation NSString(User)- (User *)userWithName{    User...
Категории@interface NSString(User)- (User *)userWithName;@end@implementation NSString(User)- (User *)userWithName{    User...
Памятьretain/release     ARC
retainCountNSMutableString *a = [[NSMutableString alloc] init];NSLog(@"%d", [a retainCount]);[a appendString:@"a"];[a reta...
retain setter- (void)setName:(NSString *)name{    NSString *prev = _name;    _name = name;    [_name retain];    [prev rel...
autorelease- (NSString *)fullName{    NSMutableString *s = [[NSMutableString alloc] init];    [s appendString:[self name]]...
retain/release• после init счетчик ссылок равен 1• когда объекту изменяют внутреннее поле  через retain-setter: retain нов...
ARC           retain    release autorelease                    [super dealloc]• автоматически генерится dealloc• автоматич...
ARCNSString *a = [[NSString alloc] init];NSLog(@"%@", a);                          release- (void)setName:(NSString *)name...
Цикл ссылок       Car                      Wheel       NSArray *_wheels        Car *carCar *car = [[[Car alloc] init] auto...
Модификаторы       • strong       • weak       • unsafe_unretained       • copy@interface Car : NSObject@property(strong, ...
Objective-C style guide• Локальные переменные: myLocalVariable• Свойства: myProperty• Классы: MyClass• Методы: doSomething...
Демонстрация
Вопросы на засыпкуКакой метод управления памятью    используется в языке Си?       А в Objective-C?
Чем отличаются строки "string1" и @"string2"
Как сохранить число 5 в массив?
Как создать объект?
Что такое «strong» и «weak»?   Чем они отличаются?
Всё!       Глеб Тарасов       gleb34@gmail.com       twitter.com/pilot34
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Upcoming SlideShare
Loading in...5
×

Школа-студия разработки приложений для iOS. Лекция 1. Objective-C

1,962

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,962
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
51
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Школа-студия разработки приложений для iOS. Лекция 1. Objective-C

  1. 1. Разработка приложений для iOS Лекция 1 Objective-C Глеб Тарасов
  2. 2. Мобильная разработка, что изменилось?
  3. 3. Особенности• Высокие ожидания пользователей• Другие паттерны использования• Маленький экран• Слабый процессор, мало памяти• Медленный интернет• Управление жестами
  4. 4. Почему iOS?
  5. 5. Разработка под iOS
  6. 6. XCode
  7. 7. Mac OS Lion
  8. 8. Как запустить Mac OS?•Компьютер Mac• Hacintosh• Виртуалка (VMWare,VirtualBox)
  9. 9. Apple Developer Program $99• Отладка на устройстве• Выпуск в AppStore
  10. 10. Objective-C
  11. 11. История1981 — Object-Oriented Pre-Compiler (OOPC).Компания StepStone. Tom Love & Brad Cox1986 — Objective-C. «Object-Oriented Programming, AnEvolutionary Approach» (Brad Cox).1988 — NeXT лицензирует Objective-C1996 — Apple покупает NeXT. Objective-C — основнойязык для Mac OS.2007 — Objective-C — основной язык для iPhone OS
  12. 12. Основные особенности• объектно-ориентированный• компилируется в машинный код• полностью совместим с Си• слабо-типизированный• управление памятью основано на счетчике ссылок
  13. 13. Сначала немного Сиhttp://ru.wikipedia.org/wiki/Си_(язык_программирования)
  14. 14. Указателиint main(int argc, const char * argv[]){ int a = 5; int *b = &a; *b = 7; printf("%d", a);} 7
  15. 15. Функции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);}
  16. 16. 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);}
  17. 17. Перечисленияtypedef enum { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear} UIViewAnimationCurve;UIViewAnimationCurve a = UIViewAnimationCurveLinear;printf("%d", a);
  18. 18. Память Стек Куча{ int *a = malloc(sizeof(int) * 10); int a = 10;} free(a);{ int a = 20;}
  19. 19. Теперь немного ООПhttp://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
  20. 20. Класс - описание внутреннего состояния + методовизменения этого состоянияОбъект - экземпляр классаПоля - состояние объектаМетоды - изменение состояния объекта
  21. 21. Класс «Работник» Поля:- имя (строка)- возраст (целое)- пол (м/ж)- время_поступления_на_работу (дата)- время_увольнения (дата)- подчиненные (массив работников) Методы:- уволить()- добавить подчиненного(работник)
  22. 22. НаследованиеКласс «Руководитель» (наследуется от«Работник») Поля: - подчиненные (массив работников) Методы: - добавить подчиненного(работник)
  23. 23. Objective-C
  24. 24. СинтаксисNSString *a = [[NSString alloc] init];NSString *b = [a copy];NSString *c = @"string";[b stringByReplacingOccurrencesOfString:@" " withString:@""];[c stringByPaddingToLength:20 withString:@" " startingAtIndex:0];
  25. 25. nil• аналог null из других языков• можно вызывать любой метод, не будет исключения• если метод возвращает объект - вернется nil• если метод возвращает число - вернется 0• если метод возвращает структуру - результат не определен
  26. 26. nilNSString *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"];}
  27. 27. BOOLBOOL a = YES;if (a) // if (a == YES){ BOOL b = [c isEqual:d]; if (!b) // if (a == NO) { //blabla }}
  28. 28. ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;
  29. 29. Структуры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);
  30. 30. Стандартные классы
  31. 31. Строки NSString NSMutableStringNSString *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);
  32. 32. Списки 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];
  33. 33. Словари 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);
  34. 34. Множества NSSet NSMutableSet Неупорядоченная коллекция. Быстрая проверка на containsNSSet *s = [NSSet setWithObjects:@"a", @"b", @"c", nil];BOOL c = [s containsObject:@"b"];NSMutableSet *m = [s mutableCopy];[m addObject:@"d"];[m removeObject:@"a"];
  35. 35. Перечисление (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);}
  36. 36. Числа NSNumberNSNumber *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");
  37. 37. Бинарные данные 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];
  38. 38. NSNull сохранять «пусто» в массивы и словариNSMutableArray *a = [[NSMutableArray alloc] init];[a addObject:[NSNull null]];NSObject *q = [a lastObject];if (q == [NSNull null]){ //bla bla}
  39. 39. 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];
  40. 40. 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);
  41. 41. Dot notationRectangle *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);
  42. 42. Собственные классы
  43. 43. Собственные классы User.h
  44. 44. Собственные классы@interface User User.h@end
  45. 45. Собственные классы@interface User : NSObject User.h@end
  46. 46. Собственные классы@interface User : NSObject{ NSString *_name;} User.h@end
  47. 47. Собственные классы@interface User : NSObject{ NSString *_name;}- (void)setName:(NSString *)name; User.h- (NSString *)name;@end
  48. 48. Собственные классы@interface User : NSObject{ NSString *_name;}- (void)setName:(NSString *)name; User.h- (NSString *)name;@end User.m
  49. 49. Собственные классы@interface User : NSObject{ NSString *_name;}- (void)setName:(NSString *)name; User.h- (NSString *)name;@end@implementation User User.m@end
  50. 50. Собственные классы@interface User : NSObject{ NSString *_name;}- (void)setName:(NSString *)name; User.h- (NSString *)name;@end@implementation User- (void)setName:(NSString *)name{} _name = name; User.m- (NSString *)name{ return _name;}@end
  51. 51. User.h
  52. 52. User.h#import <Foundation/Foundation.h>
  53. 53. User.h#import <Foundation/Foundation.h>@interface User@end
  54. 54. User.h#import <Foundation/Foundation.h>@interface User : NSObject@end
  55. 55. User.h#import <Foundation/Foundation.h>@interface User : NSObject{ NSInteger _age;}@end
  56. 56. User.h#import <Foundation/Foundation.h>@interface User : NSObject{ NSInteger _age;}@property(nonatomic, strong) NSString *name;@property(nonatomic) NSInteger age;@end
  57. 57. User.h#import <Foundation/Foundation.h>@interface User : NSObject{ NSInteger _age;}@property(nonatomic, strong) NSString *name;@property(nonatomic) NSInteger age;- (void)setAge:(NSInteger)age;- (NSInteger)age;@end
  58. 58. User.h#import <Foundation/Foundation.h>@interface User : NSObject{ NSInteger _age;}@property(nonatomic, strong) NSString *name;@property(nonatomic) NSInteger age;- (void)setAge:(NSInteger)age;- (NSInteger)age;- (void)deleteProfile;@end
  59. 59. User.h#import <Foundation/Foundation.h>@interface User : NSObject{ NSInteger _age;}@property(nonatomic, strong) NSString *name;@property(nonatomic) NSInteger age;- (void)setAge:(NSInteger)age;- (NSInteger)age;- (void)deleteProfile;- (void)postCommentWithText:(NSString *)text;- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;@end
  60. 60. User.m
  61. 61. #import "User.h"@implementation User User.m@end
  62. 62. #import "User.h"@implementation User User.m@synthesize age = _age;@synthesize name = _name;@end
  63. 63. #import "User.h"@implementation User User.m@synthesize age = _age;@synthesize name = _name;- (void)setAge:(NSInteger)age{ _age = age; NSLog(@"Установили возраст %d", age);}@end
  64. 64. #import "User.h"@implementation User User.m@synthesize age = _age;@synthesize name = _name;- (void)setAge:(NSInteger)age{ _age = age; NSLog(@"Установили возраст %d", age);}- (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);}@end
  65. 65. Admin.h
  66. 66. Admin.h#import "User.h"@interface Admin : User- (void)deleteComment:(NSInteger)key;@end
  67. 67. Admin.h#import "User.h"@interface Admin : User- (void)deleteComment:(NSInteger)key;@endAdmin.m
  68. 68. Admin.h#import "User.h"@interface Admin : User- (void)deleteComment:(NSInteger)key;@endAdmin.m#import "Admin.h"@implementation Admin- (void)deleteComment:(NSInteger)key{ //удаляем из базы NSLog(@"Комментарий с ключом %d удален", key); // оставляем комментарий, об удалении [self postCommentWithTopic:@"От админа" andText:@"Удалил коммент за хамство"];}
  69. 69. Инициализация объектов
  70. 70. Инициализация объектовUser *user = [[User alloc] init];
  71. 71. Инициализация объектовUser *user = [[User alloc] init];user.age = 34;[user setName:@"UserName"];
  72. 72. Инициализация объектовUser *user = [[User alloc] init];user.age = 34;[user setName:@"UserName"];NSString *comment = @"БлаБлаБла";[user postCommentWithText:comment];[user deleteProfile];
  73. 73. Собственный инициализатор
  74. 74. Собственный инициализатор- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}
  75. 75. Собственный инициализатор- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}- (id)init{ return [self initWithName:@"Имя по умолчанию"];}
  76. 76. Методы класса
  77. 77. Методы классаВ файле Admin.h:
  78. 78. Методы классаВ файле Admin.h:+ (Admin *)createAdmin;
  79. 79. Методы классаВ файле Admin.h:+ (Admin *)createAdmin;В файле Admin.m:
  80. 80. Методы классаВ файле Admin.h:+ (Admin *)createAdmin;В файле Admin.m:+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}
  81. 81. Методы классаВ файле Admin.h:+ (Admin *)createAdmin;В файле Admin.m:+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}Использование:
  82. 82. Методы класса В файле Admin.h: + (Admin *)createAdmin; В файле Admin.m:+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}Использование:Admin *admin = [Admin createAdmin];[admin deleteComment:10];
  83. 83. Тип id
  84. 84. Селекторы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]
  85. 85. КлассыNSString *a = @"a";id b = a;if ([b isKindOfClass:[NSString class]]){@ BOOL e = [b isEqualToString:@"a"];}
  86. 86. Протоколы
  87. 87. Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end
  88. 88. Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end@interface User : NSObject<SendMessageProtocol>@end
  89. 89. Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end@interface User : NSObject<SendMessageProtocol>@end@implementation User- (void)sendMessage:(NSString *)message{ // send message}@end
  90. 90. Протоколы@protocol SendMessageProtocol- (void)sendMessage:(NSString *)message;@end@interface User : NSObject<SendMessageProtocol>@end@implementation User- (void)sendMessage:(NSString *)message{ // send message}@endid<SendMessageProtocol> sender = [[User alloc] init];[sender sendMessage:@"message"];
  91. 91. Категории
  92. 92. Категории@interface NSString(User)- (User *)userWithName;@end
  93. 93. Категории@interface NSString(User)- (User *)userWithName;@end@implementation NSString(User)- (User *)userWithName{ User *result = [[User alloc] init]; result.name = self; return result;}@end
  94. 94. Категории@interface NSString(User)- (User *)userWithName;@end@implementation NSString(User)- (User *)userWithName{ User *result = [[User alloc] init]; result.name = self; return result;}@endUser *test = [@"Username" userWithName];
  95. 95. Памятьretain/release ARC
  96. 96. retainCountNSMutableString *a = [[NSMutableString alloc] init];NSLog(@"%d", [a retainCount]);[a appendString:@"a"];[a retain];NSLog(@"%d", [a retainCount]); 1[a release];NSLog(@"%d", [a retainCount]);[a release]; 2 1 dealloc
  97. 97. retain setter- (void)setName:(NSString *)name{ NSString *prev = _name; _name = name; [_name retain]; [prev release];}- (void)dealloc{ [super dealloc]; [_name release];}
  98. 98. 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];
  99. 99. retain/release• после init счетчик ссылок равен 1• когда объекту изменяют внутреннее поле через retain-setter: retain новому значению, release старому• когда в массив или словарь добавляют элемент - ему retain• когда удаляют элемент - release ему
  100. 100. ARC retain release autorelease [super dealloc]• автоматически генерится dealloc• автоматический retain/release при присваивании полей• автоматический retain и autorelease для возвращаемого значения из метода• автоматический release для локальной переменной при завершении области видимости
  101. 101. ARCNSString *a = [[NSString alloc] init];NSLog(@"%@", a); release- (void)setName:(NSString *)name{ [super dealloc]; _name = name;} release всех полей retain release - (void)dealloc { NSLog(@"dealloc"); }
  102. 102. Цикл ссылок Car Wheel NSArray *_wheels Car *carCar *car = [[[Car alloc] init] autorelease];Wheel *wheel = [[[Wheel alloc] init] autorelease];[wheel setCar:car];[car addWheel:wheel]; retainCount = 2 после autorelease будет retainCount = 1
  103. 103. Модификаторы • strong • weak • unsafe_unretained • copy@interface Car : NSObject@property(strong, nonatomic) NSArray *wheels;@end@interface Wheel : NSObject@property(weak, nonatomic) Car *car;@end
  104. 104. Objective-C style guide• Локальные переменные: myLocalVariable• Свойства: myProperty• Классы: MyClass• Методы: doSomethingWith:• Внутренние переменные: • _myLocal • myLocal_ • myLocal
  105. 105. Демонстрация
  106. 106. Вопросы на засыпкуКакой метод управления памятью используется в языке Си? А в Objective-C?
  107. 107. Чем отличаются строки "string1" и @"string2"
  108. 108. Как сохранить число 5 в массив?
  109. 109. Как создать объект?
  110. 110. Что такое «strong» и «weak»? Чем они отличаются?
  111. 111. Всё! Глеб Тарасов gleb34@gmail.com twitter.com/pilot34
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×