A kérdésem az lenne, hogy mikor kell használni weak illetve strong változókat block esetében.
Találtam a neten egy kódot, ami megoldja automatikusan a weak illetve strong formálást.
Tehát itt egy valós kódrészlet:
// 1
@weakify(self)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock: ^{
@strongify(self);
ValamiDocument *document = [ValamiDocument documentWithID: self.document.ID];
UIImage *image = [... create image ...];
ValamiPanel *viewController = [self.storyboard instantiateViewControllerWithIdentifier: @"ValamiPanelController"];
// 2
@weakify(document, viewController);
[viewController setImage: image];
[viewController setOnRectChanged: ^(CGRect rect) {
@strongify(document);
[document setRect: rect];
[document save];
NSLog(@"save");
}];
[viewController setOnInfoChanged: ^(NSDictionary *info, BOOL needSave) {
@strongify(document);
[document setInfo: info];
if (needSave) {
[document save];
NSLog(@"save");
}
}];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
@strongify(self, document, viewController);
[viewController setDocumentRect: document.rect];
[self.navigationController pushViewController: viewController animated: YES];
}];
}];
Szóval a kérdésem az lenne, hogy ebben a kódrészletben az AddOperationWithBlock az rögtön lefut. Ilyenkor is kell a @weakify(self) (1-es megjeyzés)? Mert ha nem, akkor gondolom egyik @strongify(self) sem kell… Bár igazából ez a kódrészlet nem futhat le újra csak amikor már felszabadult bezárom az ablakot. És akkor gondolom a második megjegyzésnél lécő viewCotnroller-hez sem kell weakify az előbbi okok miatt…?
A setOnRectChanged és setOnInfoChanged többször meghívódhat, és ott emiatt kell a document weakify és strongify. Jól gondolom?
És végezetül nem tudna-e esetleg segíteni elmagyarázni pontosan mi történik a strong weak unretained stb property meghatározásakor?