Tôi đã gặp phải hành vi lạ objc_setAssociatedObject
trong ARC. Xét đoạn mã sau:Các đối tượng liên quan đến mục tiêu-C bị rò rỉ trong ARC
static char ASSOC_KEY;
@interface DeallocTester : NSObject
@end
@implementation DeallocTester
- (void) dealloc
{
NSLog(@"DeallocTester deallocated");
//objc_setAssociatedObject(self, &ASSOC_KEY, nil, OBJC_ASSOCIATION_RETAIN);
}
@end
@implementation AppDelegate
- (void) applicationDidFinishLaunching:(UIApplication *)application
{
NSObject *test = [[DeallocTester alloc] init];
objc_setAssociatedObject(test, &ASSOC_KEY, [[DeallocTester alloc] init],
OBJC_ASSOCIATION_RETAIN);
}
tôi là tạo ra một thể hiện của DeallocTester
, sau đó tôi đặt DeallocTester
khác như một đối tượng liên quan cho nó, sau đó cả hai trong số họ đi ra khỏi phạm vi.
Tôi mong đợi -dealloc
của đối tượng đầu tiên được gọi, sau đó đối tượng liên kết sẽ được deallocated quá, nhưng tôi thấy thông báo "DeallocTester deallocated"
chỉ in một lần. Nếu tôi bỏ ghi chú dòng objc_setAssociatedObject
trong -dealloc
, đối tượng thứ hai sẽ được deallocated quá.
Tham chiếu Objective-C nêu rõ rằng các đối tượng liên quan được giải phóng tự động khi hủy đối tượng. Nó là một trình biên dịch/ARC/bất kỳ vấn đề hoặc tôi thiếu một cái gì đó?
Cập nhật
mẫu này đang thực sự làm việc nếu bạn chạy nó từ một dự án hoàn toàn mới. Nhưng tôi có hai dự án hỗ trợ ARC mà nó không có. Tôi sẽ làm một số điều tra và cung cấp một mẫu tốt hơn.
Cập nhật 2
Tôi đã điền một rdar://10636309, Associated objects leaking if NSZombie objects enabled in ARC-enabled project
Nếu bạn đang sử dụng LLVM3 + lý do tại sao bạn đang sử dụng đối tượng liên quan ? Bạn chỉ có thể tạo iVars và thuộc tính trong các danh mục trên lớp. – Abizern
@Abizern Tôi sẽ thêm ngà voi vào 'NSObject', chỉ có thể thêm các thanh màu AFAIR vào một loại mở rộng lớp mà không phải tùy ý. – iHunter
@Abizern Thật sao? Làm thế nào để bạn tạo một ivar trong một thể loại? – jlehr