Заметки делетанта 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]
Функции и методы отличаются синтаксически. Функции остались как в Си, а методы пишутся как в примере. Вызов функций и методов отличается по такому же принципу.
Например:
-(void)setUserData: (void*) userData;
Прикол что объявление каждого входного аргумента состоит из 3 элементов (вместо имя+тип, как обычно):
Минус вначале означает что метод принадлежит объекту. Если поставить плюс, будет метод класса (аля статический метод). Кстати, по ходу, можно сделать виртуальный статический метод :)
Как можно заметить, для первого аргумента имя не указывается. Так то. Идея в том, что имя метода состоит из имен агрументов, они как-бы конкатинируются. Таким образом решается проблема перегрузки методов + проблема именованных агрументо, так как по факту ты пишешь полное имя функции при вызове.
Вообще я долго плевался но на третий день привык даже к этому приколу.
Другие особенности
Для создания объекта 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>]Как можно заметить, для первого аргумента имя не указывается. Так то. Идея в том, что имя метода состоит из имен агрументов, они как-бы конкатинируются. Таким образом решается проблема перегрузки методов + проблема именованных агрументо, так как по факту ты пишешь полное имя функции при вызове.
Вообще я долго плевался но на третий день привык даже к этому приколу.
Комментарии
Отправить комментарий