6

我有Xcode的4.3內存泄漏的儀器一個非常奇怪的問題...基本上不會在下列情況下工作...泄漏檢測問題4.3

  1. 項目,而不ARC創建支持。
  2. 創建一個簡單的類它繼承UIView的
  3. 使用「按鈕」來創建這個類和「泄漏」的實例吧...泄漏不會被泄露儀器可以捕捉

所以這裏有問題的類

@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 

現在我創建了泄漏的代碼...

- (IBAction)leak:(id)sender { 
    LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    NSLog(@"class is %@", [leak class]); 
} 

所以問題是,此泄漏不會被發現...

如果我改變基類NSObject的和,而不是initWithFrame覆蓋的init(參見下文),則泄漏將被檢測....

所以這裏是如果我現在創建對象,讓它將被檢測

@interface LeakTestView : NSObject 
- (id) init; 
@end 


@implementation LeakTestView 

- (id) init { 
    NSLog(@"init called"); 
    self = [super init]; 
    if (self) { 

    } 
    return self; 
} 
@end 

對泄漏的代碼 - 檢漏將觸發和泄漏會「看到」進入儀器。

- (IBAction)leak:(id)sender { 
    LeakTestView* leak=[[LeakTestView alloc]init]; 
    NSLog(@"class is %@", [leak class]); 
} 

任何想法是怎麼回事?爲什麼不能檢測UIView子類的泄漏,但將基類更改爲NSObject將「修復」這個問題? 哦,是的,泄漏的對象可以看到使用「標記堆」 - 一個標記之前的泄漏和一個標記後,我點擊按鈕,並創建泄漏 - 班級將被視爲堆三角洲...

編輯:多了一個「有趣」的局面......如果我刪除了「初始化」的東西(只ALLOC對象)

LeakTestView* leak=[LeakTestView alloc]; 

然後泄漏會不管是基類檢測...什麼地獄在這裏?

EDIT2:多了一個 「有趣」 的事情。可以觀察到的檢漏問題只能在模擬器(的iOS 5.0,9A334是我的),但泄漏將被檢測始終如果使用iPad設備...

有何評論?如果你沒有問題,或者認爲我磺化聚醚醚酮「謊言」只是告訴我,我錯了,上面的情況是工作「就好了」 - 我的泄漏通過描述您的Xcode儀器檢測!

+0

什麼「樂器」?你使用什麼泄漏檢測器? – 2013-01-31 20:00:32

回答

0

也許它不泄露?

你撥打的是一個黑盒子的方法。 UIView initWithFrame的實現方式與您無關。它有一個合同的種類,但你沒有權利要求這泄漏了,你可以認爲保留數是1.

泄漏是一個有用的工具,但它並沒有做你認爲它的工作。它沒有告訴你什麼時候你搞砸了。它會告訴你何時有無法分配的分配。這不是一回事。

或者,它可能是一個錯誤。

+0

謝謝你的回答。我知道泄漏檢測不到分配(這個工具不是一個「魔術」解決方案來顯示問題到代碼中的位置),但是如果我檢查「泄漏」對象的保留計數,它說1(它應該)所以唯一保留的是「有效」的是來自alloc。所以對我而言,即使是「非常簡單的」,樂器也無法「發現」泄漏。創建一個示例項目來測試它是非常容易的 - 只需使用模擬器並泄露UIView的子類,並檢查儀器是否會找到它... – Sunman 2012-02-28 13:50:16

+0

我知道,我完全同意它很奇怪,但是真的留着算,真的沒有告訴你什麼。忽略它> http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ – hooleyhoop 2012-02-28 15:10:14

+0

我知道,保留計數不能用於說「有多少外部對象引用我」,因爲@property實現和可能的其他因素,但在某些情況下,它提供了正在進行的信息 - 在上述情況下,它保證對新創建對象的唯一引用來自alloc並且initWithFrame不會增加保留計數,並且這樣可以防止泄漏儀器發現泄漏... – Sunman 2012-02-28 15:22:02