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

Objective-C

Разработка приложений для iOS

Лекция 1

Глеб Тарасов

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

Мобильная разработка, что изменилось?

Page 3: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Page 4: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Page 5: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Page 6: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Page 7: Школа-студия разработки приложений для iOS. Лекция 1. Objective-C

Особенности

• Высокие ожидания пользователей• Другие паттерны использования

• Маленький экран• Слабый процессор, мало памяти• Медленный интернет• Управление жестами

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

Почему iOS?

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

Разработка под iOS

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

XCode

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

Mac OS Lion

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

Как запустить Mac OS?

•Компьютер Mac

•Hacintosh

•Виртуалка (VMWare, VirtualBox)

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

Apple Developer Program

$99

• Отладка на устройстве• Выпуск в AppStore

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

Objective-C

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

История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

Основные особенности

• объектно-ориентированный• компилируется в машинный код• полностью совместим с Си

• слабо-типизированный• управление памятью основано на счетчике ссылок

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

Сначала немного Си

http://ru.wikipedia.org/wiki/Си_(язык_программирования)

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

Указатели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

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

Структуры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

Перечисленияtypedef enum { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear} UIViewAnimationCurve;

UIViewAnimationCurve a = UIViewAnimationCurveLinear;printf("%d", a);

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

ПамятьКучаСтек

{ int a = 10;}{ int a = 20;}

int *a = malloc(sizeof(int) * 10);

free(a);

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

Теперь немного ООП

http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование

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

Класс - описание внутреннего состояния + методов изменения этого состояния

Объект - экземпляр класса

Поля - состояние объекта

Методы - изменение состояния объекта

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

Класс «Работник»

- имя (строка)- возраст (целое)- пол (м/ж)- время_поступления_на_работу (дата)- время_увольнения (дата)- подчиненные (массив работников)

- уволить()- добавить подчиненного(работник)

Поля:

Методы:

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

НаследованиеКласс «Руководитель» (наследуется от «Работник»)

- подчиненные (массив работников)

- добавить подчиненного(работник)

Поля:

Методы:

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

Objective-C

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

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

nil

• аналог null из других языков

• можно вызывать любой метод, не будет исключения

• если метод возвращает объект - вернется nil

• если метод возвращает число - вернется 0• если метод возвращает структуру - результат не определен

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

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

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

ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;

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

Структуры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

Стандартные классы

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

Строки

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

Списки

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

Словари

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

Множества

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

Перечисление (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

Числа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

Бинарные данные

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

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

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

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

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

Собственные классы

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

Собственные классы

User.h

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

Собственные классы@interface User

@end

User.h

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

Собственные классы@interface User

@end

User.h

: NSObject

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

Собственные классы@interface User

@end

User.h

{ NSString *_name;}

: NSObject

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

Собственные классы@interface User

@end

User.h

{ NSString *_name;}

- (void)setName:(NSString *)name;- (NSString *)name;

: NSObject

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

Собственные классы@interface User

@end

User.h

User.m

{ NSString *_name;}

- (void)setName:(NSString *)name;- (NSString *)name;

: NSObject

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

Собственные классы@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

Собственные классы@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

User.h

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

User.h#import <Foundation/Foundation.h>

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

User.h@interface User

@end

#import <Foundation/Foundation.h>

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

User.h@interface User

@end

#import <Foundation/Foundation.h>

: NSObject

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

User.h@interface User

@end

#import <Foundation/Foundation.h>

: NSObject

{ NSInteger _age;}

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

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

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

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

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

User.m

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

User.m#import "User.h"

@implementation User

@end

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

User.m#import "User.h"

@implementation User

@end

@synthesize age = _age;@synthesize name = _name;

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

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

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

Admin.h

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

Admin.h#import "User.h"

@interface Admin : User

- (void)deleteComment:(NSInteger)key;

@end

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

Admin.h#import "User.h"

@interface Admin : User

- (void)deleteComment:(NSInteger)key;

@end

Admin.m

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

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

Инициализация объектов

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

Инициализация объектов

User *user = [[User alloc] init];

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

Инициализация объектов

User *user = [[User alloc] init];

user.age = 34;[user setName:@"UserName"];

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

Инициализация объектов

NSString *comment = @"БлаБлаБла";

[user postCommentWithText:comment]; [user deleteProfile];

User *user = [[User alloc] init];

user.age = 34;[user setName:@"UserName"];

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

Собственный инициализатор

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

Собственный инициализатор

- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}

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

Собственный инициализатор

- (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

Методы класса

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

Методы классаВ файле Admin.h:

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

Методы класса

+ (Admin *)createAdmin;

В файле Admin.h:

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

Методы класса

+ (Admin *)createAdmin;

В файле Admin.h:

В файле Admin.m:

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

Методы класса

+ (Admin *)createAdmin;

+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}

В файле Admin.h:

В файле Admin.m:

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

Методы класса

+ (Admin *)createAdmin;

+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}

В файле Admin.h:

В файле Admin.m:

Использование:

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

Методы класса

+ (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

Тип id

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

Селекторы

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

Классы

NSString *a = @"a";id b = a;if ([b isKindOfClass:[NSString class]]){@ BOOL e = [b isEqualToString:@"a"];}

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

Протоколы

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

Протоколы@protocol SendMessageProtocol

- (void)sendMessage:(NSString *)message;

@end

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

Протоколы@protocol SendMessageProtocol

- (void)sendMessage:(NSString *)message;

@end

@interface User : NSObject<SendMessageProtocol>

@end

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

Протоколы@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

Протоколы@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

Категории

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

Категории@interface NSString(User)

- (User *)userWithName;

@end

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

Категории@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

Категории@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

Память

retain/release ARC

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

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

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

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

retain/release• после init счетчик ссылок равен 1

• когда объекту изменяют внутреннее поле через retain-setter: retain новому значению, release старому

• когда в массив или словарь добавляют элемент - ему retain

• когда удаляют элемент - release ему

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

ARC

• автоматически генерится dealloc

• автоматический retain/release при присваивании полей

• автоматический retain и autorelease для возвращаемого значения из метода

• автоматический release для локальной переменной при завершении области видимости

retain release autorelease [super dealloc]

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

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

Цикл ссылок

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

Модификаторы• 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

Objective-C style guide• Локальные переменные: myLocalVariable

• Свойства: myProperty

• Классы: MyClass

• Методы: doSomethingWith:

• Внутренние переменные: • _myLocal

• myLocal_

• myLocal

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

Демонстрация

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

Вопросы на засыпку

Какой метод управления памятью используется в языке Си?

А в Objective-C?

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

Чем отличаются строки "string1" и @"string2"

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

Как сохранить число 5 в массив?

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

Как создать объект?

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

Что такое «strong» и «weak»?

Чем они отличаются?


Recommended