NSTimer avec bloc — suis-je en train de faire?
Ce qui suit est mon Objectif C de la catégorie sur NSTimer faire basé sur des blocs de tir de NSTimers. Je ne vois rien de mal à cela, mais ce que je reçois est que le bloc je passe à la schedule...
méthode est en train d'être libéré en dépit de m'appeler copy
.
Ce qui me manque?
typedef void(^NSTimerFiredBlock)(NSTimer *timer);
@implementation NSTimer (MyExtension)
+ (void)timerFired:(NSTimer *)timer
{
NSTimerFiredBlock blk = timer.userInfo;
if (blk != nil) {
blk(timer);
}
}
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
repeats:(BOOL)repeats
callback:(NSTimerFiredBlock)blk
{
return [NSTimer scheduledTimerWithTimeInterval:seconds
target:self
selector:@selector(timerFired:)
userInfo:[blk copy]
repeats:repeats];
}
@end
Je pense que
Qui ne serait pas le cas. NSTimer prévue méthodes sont des méthodes de classe.
En passant
Les objets de la classe sont des objets de première classe en Objective-C. Aucune raison de "soi" ne peut pas pointer vers une classe. Que vous n'avez pas vu ne signifie pas qu'il n'est pas pris en charge. Voir ici.
Juste par curiosité, si vous passez à autre chose qu'à un bloc (par exemple, une instance de votre propre objet avec
(void)timerFired:(NSTimer *)timer
devrait être une méthode d'instance -
, pas une méthode de la classe +
. La même chose s'applique probablement à scheduledTimerWithTimeInterval
, mais je suis moins sûr que la.Qui ne serait pas le cas. NSTimer prévue méthodes sont des méthodes de classe.
En passant
self
que la cible suggère fortement une méthode d'instance. Tous les exemples de code de NSTimer
que j'ai vu l'utilisation de méthodes d'instance pour les sélecteurs.Les objets de la classe sont des objets de première classe en Objective-C. Aucune raison de "soi" ne peut pas pointer vers une classe. Que vous n'avez pas vu ne signifie pas qu'il n'est pas pris en charge. Voir ici.
Juste par curiosité, si vous passez à autre chose qu'à un bloc (par exemple, une instance de votre propre objet avec
dealloc
) pour userInfo
, est-ce que votre dealloc
est appelé?OriginalL'auteur user1175914 | 2012-02-23
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ce code sur au
http://orion98mc.blogspot.ca/2012/08/objective-c-blocks-for-fun.html
Excellent travail
c'est génial!!!
OriginalL'auteur Mc.Stever
Vous avez un projet sur github qui fait le travail !
Cocoapod BlocksKit, vous permettent de Blockify un tas de Classes...
OriginalL'auteur Nicolas Henin
Ce qu'il vous manque, c'est que si le bloc que vous êtes de passage dans est sur la pile, puis
copy
permettra de faire exactement ce que son nom l'indique, il va créer un copie du bloc de cours sur le tas. Vous feriez donc s'attendre à aucun changement dans le comportement de celui que vous avez passé; personne n'nouveau, c'est de les conserver. La copie de rester en vie alors que l'original est libéré.(aparté: si vous n'êtes pas à l'aide de l'ARC, vous aurez également besoin de autorelease la copie; vous êtes censé passer d'un non propriétaire de référence comme
userInfo:
. Sinon, la copie ne sera jamais libéré)OriginalL'auteur Tommy
Ici est la Swift version de Mc.Stever réponse:
OriginalL'auteur friedbunny
essayer cette
sélecteurs certainement soutenir les méthodes de la classe. votre problème est de bloquer désallouées avant timer déclenché mais je ne vois pas pourquoi ce qui se passe. quel est le message d'erreur?
OriginalL'auteur Bryan Chen