[英]Using a block as TargetAction in Objective-C
在這個答案中: 我可以使用Objective-C將塊作為@selector傳遞嗎?
Lemnar說你可以這樣做:
id block = [^{NSLog(@"Hello, world");} copy];// Don't forget to -release.
[button addTarget:block
action:@selector(invoke)
forControlEvents:UIControlEventTouchUpInside];
究竟應該在哪里發布? 在我想使用它的地方,是在viewDidLoad方法中,所以viewDidUnload似乎是釋放它的地方,但有沒有辦法在不創建ivar的情況下釋放它?
那是不支持的; invoke
方法不是public,並且Blocks不打算直接在這樣的角色中使用。
提交增強請求,並使用objc_implementationWithBlock()
和(IIRC) class_addMethod()
創建一個可在目標操作中使用的塊方法。
有些東西必須擁有該塊對象的所有權才能堅持下去。 Objective-C中的所有權意味着具有對所擁有對象的引用和引用計數(“保留”)。 如果沒有引用它,您將無法釋放它 - 這意味着泄漏。 你需要一個指向對象的變量。 按鈕本身就是擁有目標的一個很好的候選者,但UIButton
不會那樣工作。 我想你可以UIButton
子類UIButton
; 否則,是的,你需要在你的一個控制器中創建一個ivar。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.