En Objective-C, je sais que les blocs sont considérés comme des objets, donc je me demandais si il était possible de les stocker dans un tableau. Cela soulève la question, sont des blocs des objets de première classe ou sont-ils simplement traités comme des objets pour le plaisir de les passer entre les objets? Si elles sont des objets de première classe, puis ne devraient-ils pas être stockés dans des tableaux?
Réponses
Trop de publicités?EDIT: Sans entrer dans trop de détails, en vertu de l'ARC, vous pouvez maintenant ajouter des blocs de collections comme tout autre objet (voir la discussion).
J'ai laissé l'original de la réplique intacte ci-dessous, car il contient d'intéressants détails techniques.
Cela soulève la question, sont des blocs des objets de première classe ou sont-ils juste traitées comme des objets pour le plaisir de les passer entre les les objets? Si elles sont des objets de première classe, puis ne devraient-ils pas être stockés dans des tableaux?
Les blocs sont en Objective-C des objets qui se comportent comme tous les autres NSObject, avec quelques différences:
Les blocs sont toujours générés par le compilateur. Ils sont effectivement "alloc/init"ed au moment de l'exécution que de l'exécution de passe sur les blocs de déclaration.
Les blocs sont initialement créé sur la pile. Block_copy() ou l'
copy
méthode doit être utilisée pour déplacer le Bloc sur le tas si le Bloc est de survivre à la portée actuelle (voir point de l'ARC ci-dessous).Les blocs n'ont pas vraiment de appelable de l'API au-delà de la gestion de la mémoire.
Pour mettre un Bloc dans une Collection, il doit d'abord être copié.
Toujours. Y compris en vertu de l'ARC.(Voir les commentaires.) Si vous ne le faites pas, il existe un risque que la pile Bloc alloué seraautoreleased
et votre application sera plus tard crash.La copie d'une pile bloc de copier tous les prisonniers d'état, trop. Si vous réalisez plusieurs copies d'un bloc, il est plus efficace de le copier une fois, puis copie la copie, parce que la copie de la copie juste les bosses de la conserver compter depuis Blocs sont immuables).
En vertu de l'ARC, de retour d'un Bloc à partir d'une méthode ou d'une fonction "fonctionne", il sera automatiquement copié dans le tas et le retour sera effectivement un autoreleased Bloc (le compilateur peut optimiser loin l'autorelease dans certaines circonstances). Même à l'ARC, vous avez encore besoin de copier le bloc avant de le coller dans une collection.
J'ai écrit quelques posts à la fois de fournir une introduction à blocs et quelques trucs et astuces. Vous pourriez trouver intéressant.
Et, oui, l'ajout de 'em à des dictionnaires est tout à fait utile. J'ai écrit un couple de bits de code où j'ai laissé tomber des blocs dans les dictionnaires comme les gestionnaires de commande où la clé a été le nom de la commande. Très pratique.