Puis-je utiliser Objective-C, les blocs comme des propriétés?
Est-il possible d'avoir les blocs comme des propriétés en utilisant le standard de la propriété de la syntaxe?
Des changements pour ARC?
- Eh bien, parce qu'il serait très utile. Je n'aurais pas besoin de savoir ce que c'est tant que j'ai la syntaxe à droite et il se comporte comme une NSObject.
- Si vous ne savez pas ce que c'est, comment savez-vous qu'il serait très utile?
- Parce que j'utilise beaucoup 🙂
- Vous ne devriez pas les utiliser Si vous ne savez pas ce qu'ils sont 🙂
- Pourquoi voudriez-vous faire cela?
- voici quelques raisons qui viennent à l'esprit. Les blocs sont plus faciles à mettre en œuvre qu'un délégué de classe, les blocs sont légers, et vous avez accès à des variables qui sont dans le contexte de ce bloc. Les Rappels d'événement peut être fait de manière efficace à l'aide de blocs (cocos2d les utilise presque exclusivement).
- Pas complètement lié, mais depuis certains des commentaires se plaindre du "moche" bloc de syntaxe, voici un excellent article qui dérive de la syntaxe à partir de principes de base: nilsou.com/blog/2013/08/21/objective-c-blocks-syntax
- Purement pour l'enregistrement, cette question est très ancienne, et certaines personnes ont demandé "pourquoi utiliser les blocs comme des propriétés?" Je pense qu'il est maintenant très fréquemment utilisé par Apple; c'est monnaie courante. BTW grand lien Paul merci.
Vous devez vous connecter pour publier un commentaire.
Si vous allez être en répétant le même bloc, en plusieurs endroits, l'utilisation d'un type de def
@synthesize myProp = _myProp
@synthesize
la valeur par défaut est ce que vous faites@synthesize name = _name;
stackoverflow.com/a/12119360/1052616rewrite-objc
n'. Il convertit objc C++, pas de C, au moins selon la this.(void)
suffixe et au lieu d'utiliservoid (^simpleBlock)()
@property (nonatomic) MyCompletionBlock completion;
sans copier ici? Je me souviens par défaut est forte. Et le bloc a besoin d'utiliser la copie. Ceci est cohérent iciVoici un exemple de comment vous feriez pour accomplir une telle tâche:
Maintenant, la seule chose qui aurait besoin de changer si vous avez besoin de changer le type de comparer serait le
typedef int (^IntBlock)()
. Si vous avez besoin de passer deux objets, changer ceci:typedef int (^IntBlock)(id, id)
, et de changer votre bloc:J'espère que cette aide.
MODIFIER le 12 Mars 2012:
Pour l'ARC, il n'y a pas de changements spécifiques nécessaires, comme l'ARC de gérer les blocs pour vous aussi longtemps qu'ils sont définis en tant que copie. Vous n'avez pas besoin de définir la propriété à néant dans votre destructeur, soit.
Pour en savoir plus, veuillez consulter ce document:
http://clang.llvm.org/docs/AutomaticReferenceCounting.html
Pour Swift, il suffit d'utiliser fermetures: exemple.
En Objective-C,
@property (copie)void (^doStuff)(void);
C'est aussi simple que cela.
La documentation d'Apple, expliquant en détail cette question:
Apple doco.
Dans votre .h fichier:
Voici votre .m fichier:
Méfiez-vous de l'out-of-date code d'exemple.
Moderne (2014+) des systèmes, de faire ce qui est indiqué ici. C'est aussi simple que cela. Espérons que cela aide quelqu'un. Joyeux Noël 2013!
strong
au lieu decopy
?nonatomic
contrairement à de meilleures pratiques pour la plupart des autres cas, en utilisant les propriétés?Pour la postérité /l'exhaustivité de l'amour... " Voici deux exemples de la façon de mettre en œuvre cette ridiculement polyvalent "façon de faire les choses". @Robert réponse est béatement concise et correcte, mais ici, je veux aussi montrer des façons de fait de "définir" les blocs.
Idiot? Oui. Utile? Hells ouais. Voici un autre, plus "de atomique en" voie de la définition de la propriété.. et une classe qui est ridiculement utile...
Cette illustre la définition de la propriété de bloc via l'accesseur (quoique à l'intérieur de l'init, un discutable de dicey pratique..) vs le premier exemple de "nonatomic" "getter" mécanisme. Dans les deux cas... le "codé en dur" les implémentations peuvent toujours être remplacés, par exemple.. un lá..
Aussi.. si vous souhaitez ajouter une propriété de bloc dans une catégorie... dites que vous voulez utiliser un Bloc à la place de vieux-école cible /action "action"... Vous pouvez juste utiliser les valeurs associées, bien.. associer les blocs.
Maintenant, lorsque vous effectuez un bouton, vous n'avez pas à configurer certains
IBAction
drame.. Juste associer le travail à faire à la création...Ce modèle peut être appliqué à de Cacao de l'API. Utiliser les propriétés d'amener les parties pertinentes de votre code rapprocher, éliminer alambiqué délégation paradigmes, et de tirer parti de la puissance des objets au-delà de tout simplement agir comme des idiots "conteneurs".
Bien sûr, vous pouvez utiliser les blocs comme des propriétés. Mais assurez-vous qu'ils sont déclarés comme @property(copie). Par exemple:
Dans la MRC, les blocs de capture de variables de contexte sont alloués dans pile; ils seront libérés lors de la frame de pile est détruit. Si ils sont copiés, un nouveau bloc sera allouée en tas, qui peut être exécuté au plus tard après la frame de pile est poped.
Clause de non-responsabilité
Ce n'est pas prévu pour être "la bonne réponse", que cette question, demandez explicitement pour ObjectiveC. Comme Apple a introduit Swift à la WWDC14, j'aimerais partager avec vous les différentes façons d'utiliser le bloc (ou fermeture) de Swift.
Bonjour, Swift
Vous avez de nombreux moyens proposés pour passer un bloc équivalent à la fonction de Swift.
J'ai trouvé trois.
Pour comprendre cela, je vous propose de tester en terrain de jeu, ce petit morceau de code.
Rapide, optimisé pour des fermetures
Que Swift est optimisé pour asynchrones développement, Apple a travaillé plus sur les fermetures.
La première est que la fonction de signature peut être déduit de sorte que vous n'avez pas à le réécrire.
Accès params par les numéros de
Params inférence avec nommage
De Fuite Fermeture
Ce cas particulier ne fonctionne que si le bloc est le dernier argument, il est appelé de fuite fermeture
Voici un exemple (fusionné avec déduite de la signature de montrer Swift alimentation)
Enfin:
À l'aide de toute cette puissance ce que je fais est un mélange de fuite de fermeture et de l'inférence de type (avec naming pour des raisons de lisibilité)
Bonjour, Swift
En complément de ce que @Francescu répondu.
L'ajout de paramètres supplémentaires:
Vous pouvez suivre le format ci-dessous et vous pouvez utiliser la
testingObjectiveCBlock
propriété dans la classe.Pour plus d'infos, jetez un oeil ici