вызываете [self methodname] из блока?

<p>я только что натолкнулся на блоки, и я думаю, что это именно то, что я ищу, за исключением одного: возможно ли вызвать метод [self methodname] из блока?</p><p>вот что я пытаюсь сделать:</p><pre><code>-(void)somefunction{ fader* fader = [[fader alloc]init]; void (^tempfunction)(void) = ^ { [self changewindow:game]; //changewindow function is located in superclass }; [fader setfunction:tempfunction]; } </code></pre><p>я искал пару дней, и я не могу найти никаких доказательств того, что это возможно.</p><p>это вообще возможно, или я пытаюсь использовать блоки для чего-то, для чего они не предназначены?</p><p>причина, по которой я использую блоки, заключается в том, что я создал класс fader и хочу сохранить блок для его выполнения, когда он завершит исчезновение.</p><p>спасибо</p><p>правка: хорошо, я добавил в предложении, но я все еще получаю ошибку exc\_bad\_access ...</p><pre><code>-(void)somefunction{ fader* fader = [[fader alloc]init]; \_\_block myscreen* me = self; void (^tempfunction)(void) = ^ { [me changewindow:game]; //changewindow function is located in superclass }; [fader setfunction:tempfunction]; [fader release]; } </code></pre><p>может быть, я не могу дать <em>фейдер</em> функцию ...?</p>

<p>да, ты можешь это сделать.</p><p>обратите внимание, однако, что блок сохранит <code>self</code>. если вы в конечном итоге сохраните этот блок в ivar, вы можете <em>легко</em> создать цикл сохранения, что означает, что ни один из них никогда не будет освобожден.</p><p>чтобы обойти это, вы можете сделать:</p><pre><code>- (void) somemethodwithaparameter:(id)aparameter { \_\_block myselftype *blocksafeself = self; void (^tempfunction)(void) = ^ { [blocksafeself changewindow:game]; }; [self dosomethingwithblock:tempfunction]; } </code></pre><p>ключевое слово <code>\_\_block</code> означает (помимо прочего), что указанный объект не будет сохранен.</p>

<p>принятый ответ <strong> устарел </strong>. использование <code>\_\_block</code> в этом случае может привести к ошибкам!</p><p>чтобы избежать этой проблемы, рекомендуется захватить <em> слабую </em> ссылку на <code>self</code>, например так:</p><pre><code>- (void)configureblock { xyzblockkeeper * \_\_weak weakself = self; self.block = ^{ [weakself dosomething]; // capture the weak reference // to avoid the reference cycle } } </code></pre><p>пожалуйста, ознакомьтесь с <a href="https://developer.apple.com/library/ios/documentation/cocoa/conceptual/programmingwithobjectivec/workingwithblocks/workingwithblocks.html#//apple\_ref/doc/uid/tp40011210-ch8-sw16">документация apple - <strong> избегайте циклов с сильными ссылками при захвате себя </strong></a> для получения более подробной информации.</p>

<pre><code>\_\_block currentviewcontroller *blocksafeself = self; [homehelper setrestascheckin:strrestid :^(nsobject *temp) { [blocksafeself yourmethod:params]; }]; </code></pre>

<blockquote> <p>можно ли вызвать метод [self methodname] из блока?</p> </blockquote><p>да, почему бы и нет. если ваше <code>tempfunction</code> является методом экземпляра, вы можете сделать это. вызываемый метод должен быть доступен - это единственное ограничение.</p>