Tôi có một vấn đề rất lạ với các công cụ rò rỉ bộ nhớ 4,3 Xcode ... Về cơ bản nó không hoạt động trong trường hợp sau đây ...rò rỉ vấn đề phát hiện trong iOS với Xcode 4.3
- Dự án được tạo ra mà không ARC ủng hộ.
- Tạo một lớp đơn giản mà được thừa hưởng UIView
- sử dụng một "nút" để tạo thể hiện của lớp này và "rò rỉ" nó ... rò rỉ sẽ không được đánh bắt bởi rò rỉ Instruments
vì vậy đây là mã của lớp có vấn đề
@interface LeakTestView : UIView
- (id)initWithFrame:(CGRect)frame;
@end
@implementation LeakTestView
- (id)initWithFrame:(CGRect)frame
{
NSLog(@"initWithFrame called");
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
@end
Và bây giờ tôi tạo ra rò rỉ ...
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
NSLog(@"class is %@", [leak class]);
}
Vì vậy, vấn đề là bị rò rỉ này sẽ không được phát hiện ...
Nếu tôi thay đổi lớp cơ sở để NSObject và thay vì initWithFrame override init (xem dưới đây) thì bị rò rỉ sẽ được phát hiện ....
vì vậy đây là mã cho rò rỉ rằng sẼ được phát hiện
@interface LeakTestView : NSObject
- (id) init;
@end
@implementation LeakTestView
- (id) init {
NSLog(@"init called");
self = [super init];
if (self) {
}
return self;
}
@end
Nếu tôi có thể tạo đối tượng bây giờ và rời khỏi nó - phát hiện rò rỉ sẽ kích hoạt và bị rò rỉ sẽ được "nhìn thấy" vào Instruments.
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]init];
NSLog(@"class is %@", [leak class]);
}
Bất kỳ ý tưởng gì đang xảy ra? Tại sao sự rò rỉ của lớp con UIView sẽ không được phát hiện nhưng việc thay đổi lớp cơ sở thành NSObject sẽ "khắc phục" vấn đề này? Oh và có đối tượng bị rò rỉ có thể được nhìn thấy bằng cách sử dụng "Dấu heap" - một dấu trước khi bị rò rỉ và một dấu sau khi tôi nhấp vào nút và tạo ra sự rò rỉ - lớp sẽ được nhìn thấy trong vùng đồng bằng heap ...
EDIT: thêm một "funny" tình hình ... Nếu tôi loại bỏ các "init" công cụ (chỉ alloc đối tượng)
LeakTestView* leak=[LeakTestView alloc];
sau đó rò rỉ sẽ được phát hiện không có vấn đề lớp cơ sở là gì ... gì địa ngục đang diễn ra ở đây?
EDIT2: một điều "hài hước" khác. Vấn đề phát hiện rò rỉ có thể được quan sát chỉ trong Simulator (iOS 5.0, 9A334 là của tôi) nhưng rò rỉ sẽ được phát hiện luôn nếu sử dụng thiết bị iPad ...
Mọi bình luận? Nếu bạn không có vấn đề hoặc xem xét rằng tôi speek "nằm" chỉ cho tôi biết tôi sai và trường hợp trên là làm việc "tốt" - rò rỉ tôi mô tả được phát hiện bởi các công cụ xCode của bạn!
"Công cụ" là gì ?? Bạn đang sử dụng máy dò rò rỉ nào? –