Comments 2
В качестве Just for fun еще прокатит, но для использования в реальном проекте выглядит как-то страшновато…
Мне пока не ясно, какой смысл Вы вложили в слово «страшновато»(синтаксис или использование рантайма?), но все же я попытаюсь расставить все точки над i.
Способ создания объекта, что описан в пунктах 1.1/1.2, очень похож на «дедовский», вот только класс собирается в рантайме.
Вот какие плюсы я вижу уже сейчас:
+ Блоки. Возможность использовать блок(а следовательно и все его плюшки) в качестве тела метода, да еще и в местах, где это изначально не было предусмотрено: делегаты, дата соурсы и прочее.
+ Прозрачность кода (?). Сразу видно, что происходит в данном участке кода. К примеру, использование делегатов в UIAlertView не очень удобно, особенно когда их количество в viewController'e превышает цифру 2 (не даром блоки первым же делом прикрутили к UIAlertView). И вот такое объявление по делегату на alert субьективно наглядней, чем куча if'ов и попытка опредления alertView'a, пославшего событие нажатия.
Ну и конечно нужно понимать, что доводить до крайностей не стоит, и объявление целого viewController'a анонимным классом, с переопределением 5-6 методов — откровенная глупость. Пункт возможно спорный.
+ остальные плюсы анонимных классов.
Но и о минусах я помню:
-Отсутствие контроля со стороны компилятора. Получение ошибки только на этапе выполнения, а не компиляции.
-Блоки. Несмотря на все достоинства блоков, их использование может легко привести к значительным утечкам. Делать вот так — плохая идея.
— Оверхед. Приходится создавать еще один класс+невнимательность может привести к созданию целой кучи таких анонимов, возможно тут поможет reuse идентификатор. Так же стоит учитывать Block_copy(со всеми вытекающими), который вызывается при создании IMP для метода.
— ARC. Как дела обстоят с ним пока даже не представляю.
— Синтаксис. Я не считаю это проблемой, лично мне встречались и пострашней конструкции, в конце концов, есть снипеты. Но все же проблема есть.
Да, минусов много, но ведь и плюсы есть. Возможно не все так страшно?
Способ создания объекта, что описан в пунктах 1.1/1.2, очень похож на «дедовский», вот только класс собирается в рантайме.
Вот какие плюсы я вижу уже сейчас:
+ Блоки. Возможность использовать блок(а следовательно и все его плюшки) в качестве тела метода, да еще и в местах, где это изначально не было предусмотрено: делегаты, дата соурсы и прочее.
+ Прозрачность кода (?). Сразу видно, что происходит в данном участке кода. К примеру, использование делегатов в UIAlertView не очень удобно, особенно когда их количество в viewController'e превышает цифру 2 (не даром блоки первым же делом прикрутили к UIAlertView). И вот такое объявление по делегату на alert субьективно наглядней, чем куча if'ов и попытка опредления alertView'a, пославшего событие нажатия.
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Remove" message:nil delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"YES",nil];
id delegate = [NSObject newInstAnonClass:^{
ADD_METHOD(@selector(alertView:clickedButtonAtIndex:),
@protocol(UIAlertViewDelegate),
^void(id selfObj,UIAlertView* alertView,NSInteger index)
{
alertView.delegate=nil;
[selfObj release];
if (index==0) {
return;
}
[items removeLastObject];
[self.tableView reloadData];
});
}];
av.delegate=delegate;
[av show];
[av release];
Ну и конечно нужно понимать, что доводить до крайностей не стоит, и объявление целого viewController'a анонимным классом, с переопределением 5-6 методов — откровенная глупость. Пункт возможно спорный.
+ остальные плюсы анонимных классов.
Но и о минусах я помню:
-Отсутствие контроля со стороны компилятора. Получение ошибки только на этапе выполнения, а не компиляции.
-Блоки. Несмотря на все достоинства блоков, их использование может легко привести к значительным утечкам. Делать вот так — плохая идея.
NSData *data = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"http://habrahabr.ru"] ];
id delegate = [NSObject newInstAnonClass:^{
ADD_METHOD(@selector(alertView:clickedButtonAtIndex:),
@protocol(UIAlertViewDelegate),
^void(id selfObj,UIAlertView* alertView,NSInteger index)
{
...
NSLog(@"%@",data);
...
});
}];
— Оверхед. Приходится создавать еще один класс+невнимательность может привести к созданию целой кучи таких анонимов, возможно тут поможет reuse идентификатор. Так же стоит учитывать Block_copy(со всеми вытекающими), который вызывается при создании IMP для метода.
— ARC. Как дела обстоят с ним пока даже не представляю.
— Синтаксис. Я не считаю это проблемой, лично мне встречались и пострашней конструкции, в конце концов, есть снипеты. Но все же проблема есть.
Да, минусов много, но ведь и плюсы есть. Возможно не все так страшно?
Sign up to leave a comment.
Анонимные классы в Objective-C