標籤:style blog class code java javascript color strong int http rgb
@interface DemoObj()@property (nonatomic, strong) NSOperationQueue *queue;@end@implementation DemoObj- (instancetype)init{ self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self;}- (void)dealloc{ NSLog(@"demoobj dealloc");}- (void)demoOp:(id)obj{ NSLog(@"%@ %@", [NSThread currentThread], obj);}- (void)demoBlockOp{ // 不能用__weak// __weak DemoObj *weakSelf = self; // 只有self直接強引用block,才會出現循環參考 // block的管理以及線程的建立和銷毀是由隊列負責的,直接在block中使用self沒有關係! for (int i = 0; i < 10; ++i) { [self.queue addOperationWithBlock:^{ [self demoOp:@(i)]; }]; }}
在viewcontroller裡調用DemoObj的demoBlockOp方法,驗證DemoObj是否會被銷毀,這裡是否會引起block的循環參考。
DemoObj *obj = [[DemoObj alloc] init];[obj demoBlockOp];
事實證明這裡不會引起循環參考,因為這裡跟運行迴圈機制有關,在IOS中只有主線程設定了Run Loop,但是在其他子線程中就沒有設定Run Loop的,其他線程是由隊列管理的,執行完了之後就被銷毀了,所以不會引起對self的強引用。
這裡不能用__weak,因為使用了__weak之後,當出了demoBlockOp這個方法的"}"之後,obj對象就沒有被引用了,就會釋放了,就會造成demoOp方法不會被調用,或者沒有完全被調用。