2016-07-30 18 views
0

Apfel empfehlen „Verwenden Sie Zugriffsmethoden nicht in Initializer Methoden und dealloc“ mit diesem Dokument: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.htmlWas ist der richtige Weg, um Block in Initialisierungsmethoden einzurichten?

Wenn ich den Block in den Initialisierer Methoden, Block Verweise auf die Eigenschaft einrichten möchten, wie ich besser Code schreiben ?

typedef void(^customBlock)(); 

@interface CustomObject : NSObject 
@property (nonatomic, strong) NSString *string; 
@property (nonatomic, copy) customBlock customBlock1; 
@property (nonatomic, copy) customBlock customBlock2; 
@end 

@implementation CustomObject 

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     __weak __typeof(self) weakSelf = self; 

     _customBlock1 =^{ 
      __typeof(self) strongSelf = weakSelf; 
      strongSelf -> _string = @"string by iVar"; 
     }; 

     _customBlock2 = ^{ 
      weakSelf.string = @"string by accessor"; 
     }; 
    } 
    return self; 
} 

@end 
+0

Folgen Sie dieser "Empfehlung" nicht. Es ist bedeutungslos. –

+0

@ AminNegm-Awad Ich verstehe, was du meinst. Ich schrieb die Demo für dieses Problem für ["Verwenden Sie keine Accessor-Methoden in Initialisierungsmethoden und Dealloc"] (https://github.com/yangcaimu/UseAccessorMethodsInInitializerMethodsAndDeallocDemo). – Lavare

+0

Sie missverstanden mich: * Apples * Empfehlung ist bedeutungslos. Dies ist eine lange Diskussion und man kann ziemlich sicher sein, dass es zu Dutzenden von Kommentaren führen wird. –

Antwort

0
_customBlock1 =[^{ 
     __typeof(self) strongSelf = weakSelf; 
     strongSelf -> _string = @"string by iVar"; 
    } copy]; 

Dies kann die Wirkung des Aufrufs der Setter-Methode erreichen, so die Nebenwirkungen vermieden werden Verfahren zur Verwendung von Zugriffsmethoden in Initializer.

+0

Bitte fügen Sie eine Erklärung hinzu. –

+0

Ist es notwendig, eine Nachricht zum Kopieren hinzuzufügen? Aus clangs [Objective-C Automatische Referenzzählung] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#blocks) Dokumentation: Der Optimierer kann solche Kopien entfernen, wenn er sieht, dass das Ergebnis nur verwendet wird als Argument für einen Anruf. Detail: [Sollte ich noch kopieren/Block_copy die Blöcke unter ARC?] (Http://stackoverflow.com/a/23352604/3097963) – Lavare

+0

Es gibt keinen Anruf in seinem Code. Es ist eine Aufgabe. Wie Sie in der Antwort lesen können, die von Ihnen verlinkt ist, sollte eine Eigenschaft eine Kopiereigenschaft sein. Daher sollte die Zuordnung eine Kopieraufgabe sein. Dies ist eines der Beispiele, die mich dazu befähigen, das Q zu kommentieren. –