Objective-C Language Blocchi come proprietà


Esempio

@interface MyObject : MySuperclass

@property (copy) void (^blockProperty)(NSString *string);

@end

Quando si assegna, dal momento che self blockProperty , il blocco non deve contenere un forte riferimento a self. Questi reciproci riferimenti forti sono chiamati "retain cycle" e impediscono il rilascio di entrambi gli oggetti.

__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
    // refer only to weakSelf here.  self will cause a retain cycle
};

È altamente improbabile, ma il self potrebbe essere deallocato all'interno del blocco, da qualche parte durante l'esecuzione. In questo caso weakSelf diventa nil e tutti i messaggi ad esso non hanno alcun effetto desiderato. Questo potrebbe lasciare l'app in uno stato sconosciuto. Ciò può essere evitato mantenendo weakSelf con un __strong ivar durante l'esecuzione del blocco e ripulire in seguito.

__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    // refer only to strongSelf here.
    // ...
    // At the end of execution, clean up the reference
    strongSelf = nil;
};