It depends on what that someFunctionWithCompletionCallback:
does. If the method stores that block in a strong member variable, for example, it would cause a retain cycle. If the method just calls the block during its execution and does not store it, no permanent retain cycle is created.
Note that something like this:
- (void)someFunctionWithCompletionCallback:(void (^)())completionBlock {
dispatch_async(^{ completionBlock() });
}
Will retain self
temporarily (until the async dispatch is completed), since dispatch_async will retain its block, which will retain the completion block, which will retain self.