Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Так программирование больше не часть моей работы, со временем у меня появилась страсть к изучению.

Всё что написано ниже, мой небольшой опыт работы с этим языком. Кстати, всё что в заголовке указано правда. Я думаю, если вы хотите начать программировать под Mac OS X, эта статья будет неплохим началом.Так программирование больше не часть моей работы, со временем у меня появилась страсть к изучению.

Всё что написано ниже, мой небольшой опыт работы с этим языком. Кстати, всё что в заголовке указано правда. Я думаю, если вы хотите начать программировать под Mac OS X, эта статья будет неплохим началом.

Мы с вами напишем простое приложение, которое позволит как бы добавлять книги. Практически применить его вряд ли можно, но вы можете дописать его для себя – это будет только плюс вам. Cкриншот приложения:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Часть 1

Рекомендую перед началом настроить Xcode, в этой статье есть небольшие рекомендации.

Запускаем Xcode, выбираем в окне приветствия «Create a new project»:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Далее, выбираем как на скриншоте «Cocoa Application»:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

В следующем окне, указываете название проекта – Book, название компании, также можно указать префиксы к названию классов, укажите «Class Prefix» – CZ или свой вариант. Всё остальное делаем как у меня на скрине:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Далее, сохраните проект в нужную вам папку.

Пишутся приложения в Xcode с использованием паттера MVC. Поэтому давайте напишем контроллер для нашей вьюшки. Делаем как на скрине:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Далее, в появишемся окне делаем:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Окей, заглушка у нас есть. Теперь нужно привязать нашу вьюшку добавления книги к нашему только что созданому контроллеру. Выбираем в списке файлов проекта MainMenu.xib, два раза щёлкаем и… Перед нами классный дизайнер приложений – Interface Builder, во всяком случае раньше он так назывался.

Справа, есть список всех доступных элементов для создания пользовательского интерфейса. Нам нужно: 1 Text Field, 1 Wrapping Text Field, 1 Push Button и 2 Label. Вы можете сделать свой интерфейс как угодно, у меня получилось так:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Слева выбираем иконку:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Затем в правом верхнем углу выбираем:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

В поле «Class» пишем – CZBookController, тем самым привязывая вьюшку к нашему контроллеру. Основные приготовления закончены, ниже вторая часть где мы с вами будем программировать. Кстати, во второй части я покажу как привязать код к кнопке и как получить текущие значения полей с вьюшки. И да, уже сейчас вы можете запустить проект, нажмите cmd + R

Часть 2

И так, мы создали проект, настроили его, создали вьюшку и привязали к ней контроллер. Теперь нам нужно всё это оживить.

Мы с вами создадим класс CZBook, где будет два свойства – Name и Description. Затем в контроллере мы создадим экшен, из него мы получим значения с нашей вьюхи и передадим их в класс CZBook, после чего считаем значения из только что созданного класса в NSLog.

На папке Book правой кнопкой из меню выбираем New File, выбираем Objective-C class. Далее. Названи класса CZBook, Subclass – NSObjects. Далее.

Окей, добавим нужные свойства. Ддя этого выбираем описание класса CZBook.h и пишем:

//
//  CZBook.h
//  Book
//
//  Created by Дамир Фаттахов on 05.04.12.
//  Copyright (c) 2012 Coders Zone. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface CZBook : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *description;

@end

Затем в правом окне т.е в реализации класса CZBook.m:

//
//  CZBook.m
//  Book
//
//  Created by Дамир Фаттахов on 05.04.12.
//  Copyright (c) 2012 Coders Zone. All rights reserved.
//

#import "CZBook.h"

@implementation CZBook

@synthesize name;
@synthesize description;

@end

Пояснять тут нечего, кроме аттрибутов свойств, что бы не повторятся делаю копипаст с Википедии:

assign — для задания нового значения используется оператор присваивания. Используется только для POD-типов либо для объектов, которыми мы не владеем.
retain — указывает на то, что для объекта, используемого в качестве нового значения instance-переменной, управление памятью происходит вручную (не забываем потом освободить память).
copy — указывает на то, что для присваивания будет использована копия переданного объекта.

При работе под GC никакой разницы между использованием assign, retain, copy нет.

Кстати, возможно вам стало интересно что же такое @synthesize, поэтому я нагуглил вот что:

Оператор @synthesize property1; разворачивается в определения кода для сеттера и геттера (в соответствии с параметрами, которые вы указали в объявлении свойства). Вы можете и не писать @synthesize, однако в этом случае вам придется самому написать реализации геттера и сеттера. Если вы не сделаете ни того, ни другого, компилятор выдаст предупреждение, а код, который использует свойство, будет вылетать.

Наш класс готов.

Надеюсь, вы включили режим ассистента. Выбираем CZBookController.h, затем выбираем MainMenu.xib. Вниманием сейчас будет магия, нажимаем на первое текстовое поле, зажимаем ctrl и тянем до второго окна:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

И отпускаем клавишу мыши, появится вот такой красивый тултип:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Пишем – textName. Тоже самое проделываем с полем ниже, только название указываем – textDescription. Сделали? Отлично.

Теперь нам нужно написать код для кнопки Добавить. Делаем также как и выше, только в тултипе пишем следующее:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Осталось немного, выбираем в списке файлов проекта CZBookController.h и перед вами должен быть такой код:

//
//  CZBookController.h
//  Book
//
//  Created by Дамир Фаттахов on 05.04.12.
//  Copyright (c) 2012 Coders Zone. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface CZBookController : NSWindowController {
    
    IBOutlet NSTextField *textName;
    IBOutlet NSTextField *textDescription;
    
}

- (IBAction)addBook:(id)sender;

@end

Теперь, в контроллере вы можете в любой момент обратится к этим переменным. Смотрим в правое окно, в реализацию должен быть такой код:

//
//  CZBookController.m
//  Book
//
//  Created by Дамир Фаттахов on 05.04.12.
//  Copyright (c) 2012 Coders Zone. All rights reserved.
//

#import "CZBookController.h"

@implementation CZBookController

- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        // Initialization code here.
    }
    
    return self;
}

- (void)windowDidLoad
{
    [super windowDidLoad];
    
    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

- (IBAction)addBook:(id)sender {

}

@end

Это наша заглушка, добавим в импорт наш класс:

#import "CZBook.h"

Теперь мы сможем создать наш класс. Пишем в экшен addBook следующий код:

- (IBAction)addBook:(id)sender 
{
    // Выделяем память, и инициализируем объект
    CZBook *book = [[CZBook alloc] init];
    
    book.name = [textName stringValue];
    book.description = [textDescription stringValue]; 
    
    // Добавляем в лог
    NSLog(@"Имя: = %@", book.name);
    NSLog(@"Описание: = %@", book.description);
    
    // Освобождаем память
    [book release];
}

Когда я первый раз увидел синтаксис такого рода, у меня сразу возникал вопрос о конструкциях такого вида:

[textName stringValue]

Ничего сложного здесь нет. В C# такого рода код можно было написать так:

Log.add(textName.stringValue);

В Objective-C это называется отправкой сообщения, те мы послали объекту textName сообщение stringValue. Кстати, смотрите как органично выглядит этот код:

[distortionEffect setGrind:7.0 filter:9.0 level:4.0];

Вначале это кажется излишним, но со временем меня такой подход доставил. К примеру на C# этот код будет выглядеть так:

pedal.distortionEffect(7, 9, 4);

Читать такой код будет сложнее, нужно будет смотреть что значит каждый параметр. Так что подход с именованными параметрами очень хорошо.

Окей, запускаем наш проект. Вводим любые данные, затем открываем консоль:
Разработка под Mac OS X. Классы, сообщения, переменные и Interface Builder

Рекомендую просмотреть все ресурсы что я указал в Дополнительно. Исходные коды как обычно приложил тоже. Буду рад за ваши советы и замечания.

Вот пожалуй и всё что я хотел сказать. Оставайтесь вдохновлёнными, изучайте, программирование может иметь не только коммерческое значение. Удачи;)

Дополнительно

  1. Objective-C на Википедии (очень полезная статья)
  2. Описание паттерна MVC на Википедии
  3. Objective-C почти сначала
  4. Далримпл М., Кнастер С. — Objective-C 2.0 и программирование для Mac [2010, PDF, RUS]

Исходные коды приложения «Book» – [attachment=41]
Также исходные коды доступны на githubhttps://github.com/williamadama/Book

Я на Google+