[英]Objective-C, ARC: Is it correct to use __weak arguments?
这是一个使用弱参数的小例子:
@interface MYTestObject : NSObject
@end
@implementation MYTestObject {
void(^_block)(void);
}
- (void)dealloc {
NSLog(@"DEALLOC!");
}
- (id)init {
if (self = [super init]) {
[self doSomethingWithObject:self];
}
return self;
}
- (void)doSomethingWithObject:(id __weak /* <- weak argument! */)obj {
_block = ^{
NSLog(@"%p", obj);
};
}
@end
它的工作原理是: -dealloc
被调用! 另外,如果删除__weak
,则会得到一个保留周期,这是绝对正确的。
不知道这是否只是副作用,并且使用弱参数完全不安全吗? 还是这是一种特定的行为,而我只是一个不好的Google用户?
两个观察:
我倾向于在doSomethingWithObject
内进行局部__weak
引用,而不是像捕获self
时避免强引用循环中所示将其作为__weak
参数。
正如您所问的那样,我认为使用弱参数完全不安全。 但是,如果没有其他问题,那是更常见的模式,它具有局部__weak
变量,使我觉得更适合作为doSomethingWithObject
的实现细节而不是方法的公共接口的一部分。
我还将使用copy
内存限定符使block
一个属性。 正如文档所说
您应该将
copy
指定为属性属性,因为需要复制一个块以跟踪其在原始范围之外的捕获状态。 使用自动引用计数时,您不必担心这件事,因为它会自动发生,但是,最好的做法是让property属性显示结果行为。
从而:
@interface MYTestObject : NSObject
@property (nonatomic, copy) void(^block)(void);
@end
@implementation MYTestObject
- (void)dealloc {
NSLog(@"DEALLOC!");
}
- (id)init {
if (self = [super init]) {
[self doSomethingWithObject:self];
}
return self;
}
- (void)doSomethingWithObject:(MYTestObject *)obj {
typeof(obj) __weak weakObj = obj;
self.block = ^{
NSLog(@"%p", weakObj);
};
}
@end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.