Hi List,
lately I’ve been working with ObjC Blocks a lot, and often longed for more compiler support regarding warnings for strongly captured objects. Analyzing gives some warnings for capturing self
strongly in a block, but it doesn’t catch all cases, and sometimes capturing other objects can also lead to retain cycles.
So I thought maybe another approach could be possible and helpful in a potential future compiler version:
- A compiler setting to activate warnings for all strongly captured objects in blocks
- A pragma or similar to deactivate the warning locally for a list of objects
An example:
- (void)someMethod {
NSArray *someArray1 = [NSArray array];
NSArray *someArray2 = [NSArray array];
self.someProperty.block = ^{
NSLog(@"%@,%d,%@,%@",self,_instanceVariable,someArray1,someArray2);
};
}
This code block would output a warning for self
, someArray1
and someArray2
being captured strongly in the block. To silence the warning:
- (void)someMethod {
NSArray *someArray1 = [NSArray array];
NSArray *someArray2 = [NSArray array];
__weak typeof(self) weakSelf = self;
self.someProperty.block = ^{
#pragma clang allow-capture-strongly(someArray1,someArray2)
NSLog(@"%@,%d,%@,%@", weakSelf, weakSelf->_instanceVariable,someArray1,someArray2);
};
}
That way all strongly captured objects need to be approved.
What do you think? Would that make code more robust?
Yours,
Fabian