Ich habe einige rekursive Blockcode in Ziel-c, die einen Fehler EXC_BAD_ACCESS verursacht.Objective-c rekursive Blöcke mit Threads EXC_BAD_ACCESS
- (void) doSomethingWithCompletion:(void (^)())completion {
if (completion) {
dispatch_async(dispatch_get_main_queue(), completion);
}
}
- (void) testBlocks {
NSString *testString = @"hello";
__block NSInteger count = 0;
__block __weak void (^weak_block)(NSString *);
void(^strong_block)(NSString *);
weak_block = strong_block = ^(NSString *str) {
[self doSomethingWithCompletion:^{
NSLog(@"number: %zd", count);
if (++count < 10) {
weak_block(str);
}
}];
};
strong_block(testString);
}
Der Fehler tritt auf weak_block (str), die ich nehme an, weil es freigegeben wird, wenn dispatch_async genannt wird. Der Aufruf strong_block (str) in seinem Platz, wenn es mit __block wie so erklärt hat:
__block void(^strong_block)(NSString *);
Verursacht eine Warnung ‚Capturing‚strong_block‘in diesem Block stark wird wahrscheinlich zu einem behalten Zyklus führen‘.
So änderte ich den Testblock Methode nicht eine schwache Referenz wie so verwenden:
- (void) testBlocks {
NSString *testString = @"hello";
__block NSInteger count = 0;
__block void (^inner_block)(NSString *);
void(^strong_block)(NSString *);
inner_block = strong_block = ^(NSString *str) {
[self doSomethingWithCompletion:^{
NSLog(@"number: %zd", count);
if (++count < 10) {
inner_block(str);
}
}];
};
strong_block(testString);
}
Aber ich bin nicht sicher, ob dies ein Zyklus beibehalten verursacht oder wenn das Hinzufügen
__block void (^inner_block)(NSString *) = weak_block;
innerhalb des Blocks statt würde auch einen Rückhaltezyklus verursachen. Wie ist der richtige Umgang mit dieser Situation?
Mein Gehirn bei dieser von der Suche verletzt .. –