会有保留周期吗?

时间:2016-10-21 21:08:06

标签: objective-c

这是一些抽象代码。有基类“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方法中是否会有保留周期?

1 个答案:

答案 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