Cập nhật: rò rỉ này đã được giải quyết. Nếu bạn đang nhận được rò rỉ tương tự và ứng dụng của bạn là đa luồng, bạn có nhiều khả năng thực hiện cuộc gọi UIKit từ một chuỗi nền; tận dụng ví dụ [NSThread performSelectorOnMainThread:]
để định tuyến các cuộc gọi UIKit tới chủ đề chính, lànơi duy nhất được phép.Rò rỉ (cụ) báo cáo rò rỉ trong các đối tượng tự động phát hiện
Tôi đã chạy Rò rỉ trong dự án hiện tại của mình để tìm rò rỉ gần đây, và tôi tiếp tục chạy vào những "rò rỉ" mà từ những gì tôi có thể nói không thực sự bị rò rỉ. Các mã sau đây, lấy trực tiếp từ dự án, có hai rò rỉ, theo Rò rỉ:
- (NSArray *)areaForIndex:(int)index
{
NSMutableArray *a = [NSMutableArray arrayWithArray:
[world retrieveNeighborsForIndex:index]]; // leak 1
[a insertObject:[references objectAtIndex:index] atIndex:0];
return [NSArray arrayWithArray:a]; // leak 2
}
Leak 1 sẽ biến mất nếu tôi thay đổi dòng đầu tiên:
(xem Cập nhật 2-3)
Rò rỉ 2 biến mất nếu tôi thay đổi dòng cuối cùng thành:
return a;
Tôi không may làm điều đó với rò rỉ 1 vì tôi đang đúc một mảng bất biến thành mảng có thể thay đổi. Tuy nhiên, arrayWithArray có nghĩa vụ phải tự động phát hành, dù sao, vì vậy từ những gì tôi có thể nói, nó sẽ không bị rò rỉ bất cứ điều gì. Có ý kiến giải thích tại sao điều này lại xảy ra không?
Cập nhật: Tôi đã thử nghiệm điều này trên cả thiết bị và Trình mô phỏng. Rò rỉ có trên cả hai. Tuy nhiên, trên Simulator tôi nhận được thêm một số thông tin về rò rỉ này:
Lịch sử cho rò rỉ diễn ra như sau:
# | Category | Event Type | Timestamp | RefCt | Address | Size | Responsible Library | Responsible Caller
--+----------+-------------+
0 | CFArray | Malloc | 00:09.598 | 1 | 0x474f6d0 | 48 | asynchro | -[muddyGrid areaForIndex:]
1 | CFArray | Autorelease | 00:09.598 | | 0x474f6d0 | 0 | Foundation | NSRecordAllocationEvent
2 | CFArray | CFRetain | 00:09.598 | 2 | 0x474f7d0 | 0 | Foundation | -[NSCFArray retain]
3 | CFArray | CFRelease | 00:09.611 | 1 | 0x474f7d0 | 0 | Foundation | NSPopAutoreleasePool
Những điều tôi có thể phân biệt từ trên được rằng mảng autoreleased được bằng cách nào đó giữ lại hai lần và sau đó autoreleased, để lại giữ lại đếm tại 1. Không có ý tưởng nơi hoặc tại sao mặc dù ...
cập nhật 2 & 3: tôi đã cố gắng thay đổi dòng cho rò rỉ từ 1 tới:
NSMutableArray *a = [[[NSMutableArray alloc] initWithArray:
[world retrieveNeighborsForIndex:index]] autorelease];
Tôi nghĩ rằng điều này đã loại bỏ sự rò rỉ, nhưng cuối cùng thì không. Vì vậy, tôi vẫn thua lỗ.
Bạn có đang thử nghiệm trên thiết bị hoặc trình mô phỏng không? – rickharrison
Hiện chỉ có trên thiết bị. Nhưng bạn nói đúng, tôi sẽ kiểm tra và xem nó như thế nào trên Trình mô phỏng và cập nhật. – Kalle
Cập nhật mô tả ở trên để bao gồm những gì tôi đã tìm được từ việc thử nó trên Trình mô phỏng. Cảm ơn con trỏ! :) – Kalle