2016-10-21 74 views
1

这是一些抽象的代码。有基类“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初始化方法中会有保留循环吗?

回答

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