Objective-C: 在方法内部定义的块是强块还是弱块?
Objective-C: Are blocks defined inside of methods strong or weak?
我遇到这样的情况:
- (void)someMethod
{
__weak typeof(self) weakSelf = self;
void (^myBlock1)(void) = ^{
// ... do stuff
};
void (^myBlock2)(void) = ^{
[weakSelf doSomeHeavyNetworkCall2:^{
myBlock1();
}];
};
[self doSomeHeavyNetworkCall1:^{
myBlock2();
}];
}
本例中myBlock1和myBlock2的生命周期是多少?我应该像这样检查 nil 吗?
void (^myBlock2)(void) = ^{
[weakSelf doSomeHeavyNetworkCall2:^{
if (myBlock1) {
myBlock1();
}
}];
};
[self doSomeHeavyNetworkCall1:^{
if (myBlock2) {
myBlock2();
}
}];
此外,如果我将整个 someMethod
包裹在 @synchronized
中,我能保证周围有方块吗?
局部变量在 Objective-C 中默认是强的,所以 myBlock1
和 myBlock2
是强的。不需要 if (myBlock1)
和 if (myBlock2)
检查。
用 @synchronized
包装 someMethod
的内容对这些变量的生命周期没有影响。
我遇到这样的情况:
- (void)someMethod
{
__weak typeof(self) weakSelf = self;
void (^myBlock1)(void) = ^{
// ... do stuff
};
void (^myBlock2)(void) = ^{
[weakSelf doSomeHeavyNetworkCall2:^{
myBlock1();
}];
};
[self doSomeHeavyNetworkCall1:^{
myBlock2();
}];
}
本例中myBlock1和myBlock2的生命周期是多少?我应该像这样检查 nil 吗?
void (^myBlock2)(void) = ^{
[weakSelf doSomeHeavyNetworkCall2:^{
if (myBlock1) {
myBlock1();
}
}];
};
[self doSomeHeavyNetworkCall1:^{
if (myBlock2) {
myBlock2();
}
}];
此外,如果我将整个 someMethod
包裹在 @synchronized
中,我能保证周围有方块吗?
局部变量在 Objective-C 中默认是强的,所以 myBlock1
和 myBlock2
是强的。不需要 if (myBlock1)
和 if (myBlock2)
检查。
用 @synchronized
包装 someMethod
的内容对这些变量的生命周期没有影响。