Использование блока в качестве TargetAction в Objective-C - PullRequest
4 голосов
/ 25 октября 2011

В этом ответе: Могу ли я передать блок как @selector с Objective-C?

Лемнар говорит, что вы можете сделать это:

id block = [^{NSLog(@"Hello, world");} copy];// Don't forget to -release.

[button addTarget:block
           action:@selector(invoke)
 forControlEvents:UIControlEventTouchUpInside];

Гдеименно это должно быть выпущено?Где я хотел бы использовать это, в методе viewDidLoad, так что viewDidUnload кажется местом для его выпуска, но есть ли способ освободить его без создания ивара?

Ответы [ 2 ]

8 голосов
/ 25 октября 2011

Это не поддерживается; метод invoke не является общедоступным, и блоки не предназначены для непосредственного использования в такой роли.

Подайте запрос на расширение и в качестве обходного пути используйте objc_implementationWithBlock() и (IIRC) class_addMethod(), чтобы создать метод block-as, который будет работать в целевом действии.

2 голосов
/ 25 октября 2011

Что-то должно вступить во владение этим блочным объектом, чтобы он оставался рядом. Владение в Objective-C означает наличие ссылки на принадлежащий объект и счетчик ссылок («сохранить»). Вы не сможете выпустить его без ссылки на него - это означает утечку. Вам нужна переменная где-то, которая указывает на объект. Кнопка сама по себе будет хорошим кандидатом на владение своей целью, но UIButton не работает таким образом. Я полагаю, вы могли бы подкласс UIButton, возможно; в противном случае, да, вам нужно создать ивар на одном из ваших контроллеров.

...