Tôi đang gặp khó khăn khi chuyển đổi một số mã NSOperation thành ARC. Đối tượng hoạt động của tôi sử dụng một khối hoàn thành, mà lần lượt chứa một khối GCD cập nhật giao diện người dùng trên chủ đề chính. Bởi vì tôi tham chiếu đến đối tượng hoạt động của mình từ bên trong khối hoàn thành riêng của nó, tôi đang sử dụng một con trỏ __weak để tránh rò rỉ bộ nhớ. Tuy nhiên, con trỏ đã được đặt thành không theo thời gian mã của tôi chạy.Tham chiếu đối tượng NSOperation trong khối hoàn thành của riêng nó với ARC
Tôi đã thu hẹp nó xuống mẫu mã này. Bất cứ ai biết nơi tôi đã đi sai, và đúng cách để thực hiện điều này?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
// fails the check
NSAssert(weakOperation != nil, @"pointer is nil");
...
});
}];
Vâng, những gì đã xảy ra là con trỏ yếu không giữ quyền sở hữu. Nếu không có gì khác giữ biến (và không có), nó sẽ bị xóa. Bạn có chắc là bạn bị rò rỉ nếu bạn sử dụng 'hoạt động'? Nó có vẻ như nó sẽ biến mất khi khối hoàn thành được phát hành, mà nó nên được ngay khi nó được gọi. (Đó có thể là ngây thơ, mặc dù.) –
ARC đã phàn nàn về nó tại thời gian biên dịch. Nếu không có nó tôi đã sử dụng con trỏ hoạt động trực tiếp (và tôi không tin rằng tôi đã bị rò rỉ bộ nhớ). –
Chúc may mắn với điều này. Tôi nghĩ rằng tôi đã đấu tranh chống lại nó trong vài giờ trước khi bỏ cuộc và làm điều gì đó khác. Nhưng đã lâu rồi. :) –