Est-il possible d'avoir des blocs comme propriétés en utilisant la syntaxe de propriété standard?
Y a-t-il des changements pour ARC ?
Est-il possible d'avoir des blocs comme propriétés en utilisant la syntaxe de propriété standard?
Y a-t-il des changements pour ARC ?
Réponses:
Si vous allez répéter le même bloc à plusieurs endroits, utilisez un type def
la source
@synthesize myProp = _myProp
@synthesize
la valeur par défaut, c'est ce que vous faites@synthesize name = _name;
stackoverflow.com/a/12119360/1052616Voici un exemple de la façon dont vous accomplirez une telle tâche:
Maintenant, la seule chose qui devrait changer si vous deviez changer le type de comparaison serait le
typedef int (^IntBlock)()
. Si vous devez lui passer deux objets, changez-le en ceci:typedef int (^IntBlock)(id, id)
et changez votre bloc en:J'espère que ça aide.
EDIT 12 mars 2012:
Pour ARC, aucune modification spécifique n'est requise, car ARC gère les blocs pour vous tant qu'ils sont définis comme copie. Vous n'avez pas non plus besoin de définir la propriété sur zéro dans votre destructeur.
Pour plus de lecture, veuillez consulter ce document: http://clang.llvm.org/docs/AutomaticReferenceCounting.html
la source
Pour Swift, utilisez simplement des fermetures: exemple.
Dans l'objectif-C:
@property (copy) void
C'est si simple.
Voici la documentation Apple actuelle, qui indique précisément ce qu'il faut utiliser:
Doco d'Apple.
Dans votre fichier .h:
Voici votre fichier .m:
Méfiez-vous des exemples de code obsolètes.
Avec les systèmes modernes (2014+), faites ce qui est montré ici. C'est aussi simple que cela.
la source
strong
au lieu decopy
?nonatomic
différente des meilleures pratiques pour la plupart des autres cas d'utilisation de propriétés?Par souci de postérité / exhaustivité… Voici deux exemples complets de la façon de mettre en œuvre cette "façon de faire" ridiculement polyvalente. @ La réponse de Robert est parfaitement concise et correcte, mais ici je veux aussi montrer des façons de réellement "définir" les blocs.
Idiot? Oui. Utile? Hells ouais. Voici une manière différente, "plus atomique" de définir la propriété .. et une classe qui est ridiculement utile ...
Cela illustre la définition de la propriété de bloc via l'accesseur (bien qu'à l'intérieur d'init, une pratique discutable ..) par rapport au mécanisme "getter" "non anatomique" du premier exemple. Dans les deux cas… les implémentations "codées en dur" peuvent toujours être écrasées, par exemple .. a lá ..
Aussi .. si vous voulez ajouter une propriété de bloc dans une catégorie ... dites que vous voulez utiliser un bloc au lieu d'une "action" cible / action à l'ancienne ... Vous pouvez simplement utiliser des valeurs associées pour, eh bien .. associer les blocs.
Maintenant, quand vous faites un bouton, vous n'avez pas à mettre en place un
IBAction
drame .. Associez simplement le travail à faire à la création ...Ce modèle peut être appliqué OVER et OVER aux API Cocoa. Utiliser les propriétés pour amener les parties pertinentes de votre code rapprocher , éliminer les paradigmes de la délégation alambiquée , et de tirer parti de la puissance des objets au - delà de tout agir comme des « conteneurs » muets.
la source
Bien sûr, vous pouvez utiliser des blocs comme propriétés. Mais assurez-vous qu'ils sont déclarés comme @property (copie) . Par exemple:
Dans MRC, les blocs capturant les variables de contexte sont alloués en pile ; ils seront libérés lorsque le cadre de pile sera détruit. S'ils sont copiés, un nouveau bloc sera alloué en tas , qui peut être exécuté plus tard après que le cadre de pile ait été sauté.
la source
Disclamer
Ce n'est pas censé être "la bonne réponse", car cette question demande explicitement ObjectiveC. Comme Apple a présenté Swift lors de la WWDC14, j'aimerais partager les différentes façons d'utiliser le blocage (ou les fermetures) dans Swift.
Bonjour Swift
Vous avez plusieurs façons de passer un bloc équivalent à fonctionner dans Swift.
J'en ai trouvé trois.
Pour comprendre cela je vous propose de tester en terrain de jeu ce petit bout de code.
Rapide, optimisé pour les fermetures
Comme Swift est optimisé pour le développement asynchrone, Apple a davantage travaillé sur les fermetures. La première est que la signature de fonction peut être déduite de sorte que vous n'avez pas à la réécrire.
Accéder aux paramètres par numéros
Inférence de paramètres avec nommage
Fermeture arrière
Ce cas spécial ne fonctionne que si le bloc est le dernier argument, il est appelé fermeture de fin
Voici un exemple (fusionné avec une signature inférée pour montrer la puissance de Swift)
Finalement:
En utilisant toute cette puissance, je mélangerais la fermeture de fin et l'inférence de type (avec un nom pour la lisibilité)
la source
Bonjour Swift
Complétant ce que @Francescu a répondu.
Ajout de paramètres supplémentaires:
la source
Vous pouvez suivre le format ci-dessous et utiliser la
testingObjectiveCBlock
propriété dans la classe.Pour plus d'informations jetez un œil ici
la source