Заметки делетанта Objective C

В ходе разработки кроссплатформенного движка приходится сталкиваться с Objective C. Создание подобных заметок помогает разложить информацию по полочкам и освежает память.

Пример

Создание базового приложения с окном

// Делегат для получения событий окна (см. реализацию внизу)
@interface MyWindowDelegate : NSObject <NSWindowDelegate>
@property int a; // На сколько я понял, публичных полей нет
@end
void createMacOsApp () {
    [NSApplication sharedApplication];
// Вызов метода глобального объекта NSApp
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
    id applicationName = [[NSProcessInfo processInfo] processName];
    id window = [[NSWindow alloc]
        initWithContentRect:NSMakeRect(100, 100, 640, 640)
        backing:NSBackingStoreBuffered
        defer:NO
    ];
    [window cascadeTopLeftFromPoint:NSMakePoint(20,20)];
    [window setTitle: applicationName];
    [window makeKeyAndOrderFront:nil];
    [NSApp activateIgnoringOtherApps:YES];
// Создаем делегат для получения событий окна (в моем приемере - событие windowDidUpdate)
    MyWindowDelegate* windowDelegate = [MyWindowDelegate alloc];
    windowDelegate.a = 0; // Доступ к свойству
    [window setDelegate:windowDelegate];
    [NSApp run];
}

@implementation MyWindowDelegate
@synthesize a; // Это как бы реализация свойства
- (void)windowDidUpdate:(struct Notification *)notification {
    ++a;
}

- (void)windowWillClose:(NSNotification *)notification {
    [NSApp terminate:self];
}
@end

Менеджмент памяти

https://habr.com/post/83688/
Есть целых три варианта:
Базовый
  NSString* t = [NSString alloc]; [t release];
Продвинутый
  @autoreleasepool {}
Автоматический
  http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects.operands.casts
  Включается -fobjc-arc
  При преобразованиях типов из Си в ObjC и обратно, добавляем __bridge
  (__bridge NSWindow*)pView
      и обратно
   return (__bridge void*)metalLayer;

Другие особенности


Для создания объекта NSString, пишем @"строка"

Для конструирование объектов [<Type> alloc]

Функции и методы отличаются синтаксически. Функции остались как в Си, а методы пишутся как в примере. Вызов функций и методов отличается по такому же принципу.


Объявление функции в классе

- (<return type>)<func name> : (<arg type>) <arg name> <func name ext> : (<arg type2>) <arg name2> ;
Например:

-(void)setUserData: (void*) userData;
Прикол что объявление каждого входного аргумента состоит из 3 элементов (вместо имя+тип, как обычно):

  • расширения имени функции - имею в виду, имя функции становится длинее с каждым новым аргументом
  • тип аргумента
  • имя аргумента - по нему можно получить доступ к мякотке аргумента

Минус вначале означает что метод принадлежит объекту. Если поставить плюс, будет метод класса (аля статический метод). Кстати, по ходу, можно сделать виртуальный статический метод :)

Вызов метода

[<func name> : <arg value 1> <func name ext> : <arg value 2>]
Как можно заметить, для первого аргумента имя не указывается. Так то. Идея в том, что имя метода состоит из имен агрументов, они как-бы конкатинируются. Таким образом решается проблема перегрузки методов + проблема именованных агрументо, так как по факту ты пишешь полное имя функции при вызове.

Вообще я долго плевался но на третий день привык даже к этому приколу.

Комментарии

Популярные сообщения из этого блога

Siege Up! Editor (beta)

STM32F4 и программный выход в DFU

Git и Yandex.Disk