这是一些抽象代码。有基类“BaseClass”和子类“MyClass”
BaseClass
@property (nonatomic, copy) BlockType block;
- initBaseClassWithBlock:(BlockType)block {
self = [super init];
if (self) {
self.block = block;
}
return self;
}
MYClass : BaseClass
@property (strong, nonatomic) NSString *myString;
- (instancetype)init {
self = [super initBaseClassWithBlock:^{
NSLog(@"%@", self.myString);
}
return self;
}
MyClass init方法中是否会有保留周期?
答案 0 :(得分:1)
是;这是一个保留周期。
您可以将代码粘贴到一个简单的项目中,然后使用Xcode 8的内存图调试器进行检查。
复制/粘贴代码的可编译版本,然后构建并运行。它将永远运行,什么都不做。单击小对象图调试器图标(其中包含线条的三个圆圈),它将显示您从子实例通过块返回自身的强引用。
@interface Base:NSObject
@property (nonatomic, copy) dispatch_block_t block;
@end
@interface Sub:Base
@property (strong, nonatomic) NSString *myString;
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Sub *s = [[Sub alloc] init];
}
dispatch_main();
return 0;
}
@implementation Base
- initBaseClassWithBlock:(dispatch_block_t)block
{
self = [super init];
if (self) {
self.block = block;
}
return self;
}
@end
@implementation Sub
- (instancetype)init {
if (self = [super initBaseClassWithBlock:^{
NSLog(@"%@", self.myString);
}]) {
;
}
return self;
}
@end