squeek school
Разработка приложений для iOS
          занятие #2
http://school.squeek.ru
Пронин Сергей
Empatika, Software Engineer

Высшая Школа Экономики,
 программная инженерия

sergey.pronin@empatika.com
основы Objective-C
Objective-C

• ООП
• Синтаксис
• Сообщения
• Управление памятью
• Основные классы (NSString, NSArray,
  NSDictionary)
Практика
•   Класс - Stack (стэк)

•   Добавить объект в стэк

•   init, initWithArray:

•   Дать самый верхний (удаляется)

•   Количество элементов

•   Выдать объединенную строку

•   Есть ли элемент или нет

•
множественные init


- (id)init;
- (id)initWithName:(NSString *)name;
- (id)initWithName:(NSString *)name age:(int)age;
управление объектом

• Выделение памяти - alloc
• Освобождение памяти - dealloc
• dealloc никогда не вызывается
  самостоятельно! (почти)
подсчет использования
• Живой пока count >0
• alloc и copy создают объект с count=1
• retain увеличивает count на 1
• release уменьшает count на 1
• когда count=0 => dealloc
• retainCount
пример
Person *person = nil;
person = [[Person alloc] init];

[person setName:@“John Galt”];
[person setAge:32];
[person castBallot];
[person doSomethingElse];

[person release];
что будет?

Person *person = [[Person alloc] init];
// ...
[person release];
[person doSomething];
собственный dealloc
       метод
#import "Person.h"

@implementation Person

- (void)dealloc {
  // ...

  [super dealloc]; //Только здесь!
} @end
владение объектом
#import <Foundation/Foundation.h>

@interface Person : NSObject {
  NSString *name;
  int age;
}

- (NSString *)name;
- (void)setName:(NSString *)value;
- (int)age;
- (void)setAge:(int)age;
- (BOOL)canLegallyVote;
- (void)castBallot;
@end
владение объектом
#import "Person.h"

@implementation Person
- (NSString *)name {
  return name;
}
- (void)setName:(NSString *)newName {
if (name != newName) {
  [name release];                       зачем проверка?
  name = [newName retain];
} @end
второй вариант
#import "Person.h"

@implementation Person
- (NSString *)name {
return name;
}
- (void)setName:(NSString *)newName {
if (name != newName) {
[name release];
name = [newName copy];
} @end
освобождение памяти
#import "Person.h"

@implementation Person

- (void)dealloc {
  [name release];
  [super dealloc];
} @end
autorelease

- (NSString *)fullName {
   NSString *result;
   result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName];
   return result;
   }



                        утечка памяти!
                    создали, но не уследили
autorelease

- (NSString *)fullName {
   NSString *result;
   result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName];

  [result release];

  return result;
  }


                           слишком рано!
autorelease

- (NSString *)fullName {
   NSString *result;
   result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName];

  [result autorelease];

  return result;
  }


                                   ok!
Autorelease Pools (in pictures)

                 механизм autorelease




                 pp                   zed                                   nt               t
          ch
               a
                                  ali                   nib               e                en          pp
        n                      iti                ain                   ev               ev        it a
      au                    in                                       or
                                                                                     dle         Ex
     L
                       pp                      adm               it f              n
                      A                     Lo                Wa                 Ha

Tuesday, January 12, 2010
комильфо


• alloc, new или copy возвращают не
  autorelease объект
• остальные - autorelease
нет autorelease!
• когда нужно хранить объект долго
• вызываем [object retain]
{
    name = [NSMutableString string];
    ...
    [name retain];
}

//...
{
  [name release];
}
cвойства

• Доступ к полям объекта
• Простота getter/setter
• Определение политики использования
• Но! можно переопределить get и set
декларация свойств
#import <Foundation/Foundation.h>

@interface Person : NSObject {
  NSString *name;
  int age;
}

@property int age;
@property (copy) NSString *name;
@property (readonly) BOOL canLegallyVote;
- (void)castBallot;

@end
synthesize
@implementation Person

@synthesize age;
@synthesize name;

- (BOOL)canLegallyVote {
  return (age > 17);
}

@end
атрибуты свойств
•   @property int age;

•   @property (readonly) BOOL canLegallyVote

•   @property (assign) NSString *name;

•   @property (retain) NSString *name;

•   @property (copy) NSString *name;

•   можно самим создать get и set
.dot синтаксис


• object.property = 2;
• int number = object.property;
осторожно с dot
в header:
@property int age;

в implementation:
@implementation Person
- (void)setAge:(int)newAge {
  self.age = newAge;
@end

            Что произойдет?
@protocol Locking   протоколы
- (void)lock;
- (void)unlock;
@optional
- (void)open;
@end

@interface SomeClass : SomeSuperClass <Locking>
//...
@end
                - setMyValue:(id) foo;
      сравни
                - setMyValue:(id <aProtocol>) foo;
основы Objective-C


done!
Основы разработки
• MVC
• Views,ViewControllers
• Жизненный цикл
• Xcode 4, Xcode 3 + Interface Builder
• UIKit framework
анатомия приложения

• Компилированный код
• Nib файл ( UI элементы + связи)
• Ресурсы (изображения, звуки)
• Info.plist файл - конфигурация
  приложения
UIKit Framework
• базовый framework
• стандартные элементы
• запускает приложение и контролирует
  жизненный цикл приложения
• доступ к объекту UIApplication:
  [UIApplication sharedApplication];
• Управление статус-баром, иконкой
  приложения
делегаты

• вместо наследования предоставляем
  делегат с реализованными методами

• используется в UIApplication ■
  UITableView ■ UITextField
UIApplicationDelegate
           • Xcode создает самостоятельно
           • участие в жизни приложения
           • реализует методы, которые вызывает
               UIApplication
-   (void)applicationDidFinishLaunching:(UIApplication *)application;
-   (void)applicationWillTerminate:(UIApplication *)application;
-   (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
-   (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
Info.plist file
• Описание настроек приложения
 -   Icon appearance
 -   Status bar style (default, black, hidden)
 -   Orientation
 -   Uses Wifi networking
 -   System Requirements
Xcode + Hello World!



  Xcode

Squeek school 2