2012-04-12 6 views
1

Beispiel:Welchen Qualifier sollte ich verwenden, um einen Block als einen Ivar zu deklarieren?

 
typedef void(^responseBlock)(NSDictionary*, NSError *); 
@interface MyClass : NSObject 
{ 
    [??] responseBlock responseHandler; 
} 

Was Qualifier sollte ich in den put [??] Klammern?

Ich habe gelesen, dass Blöcke als Eigenschaften mit dem Kopierqualifikationsmerkmal eingerichtet werden sollen ... aber in diesem Fall brauche ich den Block nicht als eine Eigenschaft exponiert. Ich möchte einfach, dass es ein Ivar bleibt, aber wie kann ich eine Kopie angeben? Und ohne Angabe von was ist der Standardqualifikator? Ist es so stark wie bei allem anderen?

Ich verwende ARC auf ios5.

Antwort

5

Ja, Blöcke sind Objekte in ObjC, daher ist __strong der entsprechende Qualifier. Da das die Standardeinstellung ist, können Sie es tatsächlich abstellen.

Es gibt keine Möglichkeit für Sie festzulegen, dass der Block bei der Zuweisung ohne eine Eigenschaft kopiert werden soll - das liegt in Ihrer Verantwortung (responseHandler = [someBlock copy];). Sie könnten eine Eigenschaft deklarieren, das zu dieser Klasse nur sichtbar ist selbst (nicht auf anderen Code verfügbar) eine Klassenerweiterung in .m Datei setzen:

@interface MyClass() 
@property (copy) responseBlock responseHandler; 
@end 

Diese (auf synthetisiert wird) werden Sie die üblichen Zugriffsmethoden , die sich um die Kopie kümmern, wenn Sie sie verwenden.

Beachten Sie auch, dass es möglich ist (now the recommended procedure) Instanzvariablen im @implementation Block zu deklarieren. Es klingt, als ob Sie möchten, dass dies ein privates Attribut ist (kein Zugriff auf Eigenschaften), und die dort deklarierten Ivars können von keinem anderen Code gesehen werden. (Natürlich müssen Sie nicht, dies zu tun, wenn Sie eine Eigenschaft verwenden; @synthesize die Ivar für Sie.)

@implementation MyClass 
{ 
    responseBlock responseHandler; 
} 

// Continue with implementation as usual 
+0

ausgezeichnet, das aufräumt durchaus ein paar Dinge für mich. Danke für die ausführliche Antwort und den Aufruf an die neu empfohlene Praxis, innerhalb der Implementierung Ivars zu deklarieren. –