2016-10-21 72 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