Знакомство с iOS
Мобильная разработка, что
      изменилось?
Особенности
• Высокие ожидания пользователей
• Другие паттерны использования
• Маленький экран
• Слабый процессор, мало памяти
• Медленный интернет
• Управление жестами
Разработка под iOS
XCode
Как запустить Mac OS?

•Купить Mac
• Hacintosh
• Виртуалка
Apple Developer
         Program


                          $99
• Отладка на устройстве
• Выпуск в AppStore
Objective-C
История
1981 — Object-Oriented Pre-Compiler (OOPC).
Компания StepStone. Tom Love & Brad Cox

1986 — Objective-C. «Object-Oriented Programming, An
Evolutionary Approach» (Brad Cox).

1988 — NeXT лицензирует Objective-C

1996 — Apple покупает NeXT. Objective-C — основной
язык для Mac OS.

2007 — Objective-C — основной язык для iPhone OS
Основные особенности
• объектно-ориентированный
• компилируется в машинный код
• полностью совместим с Си
• слабо-типизированный
• счетчик ссылок (iOS)
• garbage collector (MacOS)
Синтаксис
User.h
User.h
@interface User




@end
User.h
@interface User : NSObject




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

@interface User : NSObject




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

@interface User : NSObject




- (void)deleteProfile;




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

@interface User : NSObject




- (void)deleteProfile;

- (void)postCommentWithText:(NSString *)text;

- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;

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

@interface User : NSObject

@property(nonatomic, strong) NSString *name;

@property(nonatomic) NSInteger age;




- (void)deleteProfile;

- (void)postCommentWithText:(NSString *)text;

- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;

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

@interface User : NSObject

@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
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;

- (void)setAge:(NSInteger)age
{
    _age = age;
    NSLog(@"Установили возраст %d", age);
}




@end
#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
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;

@end


Admin.m
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:@"Удалил коммент за хамство"];
}
Инициализация объектов
Инициализация объектов
User *user = [[User alloc] init];
Инициализация объектов
User *user = [[User alloc] init];
user.age = 46;
[user setName:@"MedvedevRussia"];
Инициализация объектов
User *user = [[User alloc] init];
user.age = 46;
[user setName:@"MedvedevRussia"];

NSString *comment = @"Я считаю, что было бы правильно
                      выдвинуть Владимира Путина на
                      должность президента страны";

[user postCommentWithText:comment];

[user deleteProfile];
Собственный инициализатор
Собственный инициализатор
- (id)initWithName:(NSString *)name
{
    self = [super init];
    if (self)
    {
        self.name = name;
    }
    return self;
}
Собственный инициализатор
- (id)initWithName:(NSString *)name
{
    self = [super init];
    if (self)
    {
        self.name = name;
    }
    return self;
}


- (id)init
{
    return [self initWithName:@"Имя по умолчанию"];
}
Методы класса
Методы класса
В файле Admin.h:
Методы класса
В файле Admin.h:
+ (Admin *)createAdmin;
Методы класса
В файле Admin.h:
+ (Admin *)createAdmin;

В файле Admin.m:
Методы класса
В файле Admin.h:
+ (Admin *)createAdmin;

В файле Admin.m:
+ (Admin *)createAdmin
{
    Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"];
    admin.age = 34;
    return admin;
}
Методы класса
В файле Admin.h:
+ (Admin *)createAdmin;

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


Использование:
Методы класса
 В файле 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];
Переменные класа (ivar-ы)
Переменные класа (ivar-ы)
@interface User : NSObject
{
    NSString *_name;
}

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

@end
Переменные класа (ivar-ы)
@interface User : NSObject
{
    NSString *_name;
}

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

@end
@implementation User

- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}

@end
Протоколы
Протоколы
@protocol SendMessageProtocol <NSObject>

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

@end
Протоколы
@protocol SendMessageProtocol <NSObject>

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

@end

@interface User : NSObject<SendMessageProtocol>

@end
Протоколы
@protocol SendMessageProtocol <NSObject>

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

@end

@interface User : NSObject<SendMessageProtocol>

@end

@implementation User

- (void)sendMessage:(NSString *)message
{
    // send message
}

@end
Протоколы
@protocol SendMessageProtocol <NSObject>

- (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"];
Категории
Категории
@interface NSString(User)

- (User *)userWithName;

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

- (User *)userWithName;

@end

@implementation NSString(User)

- (User *)userWithName
{
    User *result = [[User alloc] init];
    result.name = self;
    return result;
}

@end
Категории
@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];
Objective-C style guide
• Локальные переменные: myLocalVariable
• Свойства: myProperty
• Классы: MyClass
• Методы: doSomethingWith:
• Внутренние переменные:
   • _myLocal
   • myLocal_
   • myLocal
Демонстрация XCode
Всё!

Вопросы?

        Глеб Тарасов
        vkontakte.ru/pilot34
        twitter.com/pilot34
Темы для подготовки
• Указатели
   • ссылки
   • указатели
   • стек
   • куча
Темы для подготовки

• Управление памятью
   • retain/release/autorelease
   • Automatice Reference Counting (ARC)
   • Garbage Collector
Темы для подготовки
• Foundation.framework
   • NSObject
   • NSString
   • NSArray
   • NSDictionary
   • ...
Темы для подготовки


Model-View-Controller (MVC)
Темы для подготовки


Как запустить XCode без мака?
       (Отчёт о попытках)

Курсы по мобильной разработке. 1 лекция. Знакомство с iOS