Pull to refresh

Comments 2

В качестве Just for fun еще прокатит, но для использования в реальном проекте выглядит как-то страшновато…
Мне пока не ясно, какой смысл Вы вложили в слово «страшновато»(синтаксис или использование рантайма?), но все же я попытаюсь расставить все точки над i.

Способ создания объекта, что описан в пунктах 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.

Articles