2012-05-21 74 views
4

所以我一直在調試像一個瘋狂的男人在樂器中使用NSZombiesEnabled和NSZombies。但是,使用殭屍來運行應用程序似乎可以解決我的問題。當我在儀器中運行沒有NSZombiesEnabled或NSZombies的應用程序時,它會崩潰。有關如何處理這個問題的任何想法?NSZombieEnabled防止我的應用程序崩潰

所以問題是我釋放了兩次,但似乎無法找到我在做什麼。打開NSZombieEnabled將無法幫助,因爲程序運行良好,但不會告訴我我釋放的位置。

所以我覺得我有點知道它的崩潰,我有我創建這個globalArray Singleton類:

extern NSString * const kClearDataSource; 

@interface AHImageDataSource : NSObject 
+ (AHImageDataSource *)sharedDataSource; 
- (void) clearDataSource; 
- (void) addObject:(id) object; 
- (void) addObject:(id)object atIndex:(int) index; 
- (int) count; 
- (id) objectAtIndex:(int) index; 
@end 



NSString * const kClearDataSource = @"clearDataSource"; 

@interface AHImageDataSource() 
{ 
    NSMutableArray * imageDataSource_; 
} 

@property (nonatomic, retain) NSMutableArray * imageDataSource_; 

@end 

@implementation AHImageDataSource 
@synthesize imageDataSource_; 

+ (AHImageDataSource *)sharedDataSource { 
    static AHImageDataSource *_sharedClient = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _sharedClient = [[self alloc] init]; 
    }); 

    return _sharedClient; 
} 


- (id)init { 
    self = [super init]; 
    if (!self) { 
     return nil; 
    } 

    NSMutableArray * temp = [[NSMutableArray alloc] initWithCapacity:200]; 
    self.imageDataSource_ = temp; 
    [temp release]; 


    return self; 
} 

-(void) clearDataSource 
{ 
    if ([self.imageDataSource_ count] > 0){ 
     [self.imageDataSource_ removeAllObjects]; 
    } 
} 

- (void) addObject:(id) object 
{ 
    [self.imageDataSource_ addObject:object]; 
} 

- (void) addObject:(id)object atIndex:(int) index 
{ 
    [self.imageDataSource_ insertObject:object atIndex:index]; 
} 

- (int) count 
{ 
    return [self.imageDataSource_ count]; 
} 

- (id) objectAtIndex:(int) index 
{ 
    if (index >= 0 && index < [self.imageDataSource_ count]){ 
     return [self.imageDataSource_ objectAtIndex:index]; 
    } 

    return nil; 
} 

- (void) dealloc 
{ 
    [super dealloc]; 
    [imageDataSource_ release]; 
} 

@end 

在我試圖刪除所有在對象的代碼中的一個點數組,然後添加一些東西。當發生這種情況時發生崩潰。

的這部分代碼崩潰,它在執行第二次:

NSArray *arr = [response valueForKey:@"data"]; 
       if ([arr count] > 0){ 
        [[AHImageDataSource sharedDataSource] clearDataSource]; 
       } 

       for (NSDictionary * data in arr){ 
        AHInstagramImageData * imgData = [[AHInstagramImageData alloc] initWithData:data]; 
        [[AHImageDataSource sharedDataSource] addObject:imgData]; 
        [imgData release]; 
       } 
+0

檢查此問題[http://stackoverflow.com/questions/4164233/nszombieenabled-fixes-my-app](http://stackoverflow.com/questions/4164233/nszombieenabled-fixes-my-app) –

+0

看到帖子,根本沒有幫助 – adit

回答

3

你絕對不應該這樣做[super dealloc]第一個在你的-dealloc方法中。它必須來最後

+0

另外,您應該使用ARC,在這種情況下,您根本不需要[super dealloc]語句。 – Keller

+0

首先是[super dealloc]是什麼引起了我的問題。 –

1

GO GO產品 - >分析。顯示的消息將爲您提供解決方案或想法。

1

當已釋放對象的消息被髮送時,您的應用程序崩潰。 NSZombiesEnabled可以防止你的應用程序崩潰,因爲它支持所有釋放對象(並因此泄漏所有內容)。當釋放對象發送消息時(它通常會導致應用程序崩潰),它將在控制檯中輸出消息。 「發送給釋放對象'foo'」(或類似的東西)的「消息」欄的影響。它實際上並沒有暫停執行你的應用程序。

當您通過了解您的應用程序通常崩潰的點時,請查看控制檯日誌以獲取與上述類似的消息。

+0

所以你說要打開NSZombiesEnabled? – adit

+0

是的,爲了排除代碼故障,您可以將其打開,然後在應用程序不會崩潰的地方通過它查看控制檯中的消息,以查看發送到釋放對象的消息。 – sc0rp10n

+2

當NSZombieEnabled存在時沒有任何東西輸出到控制檯 – adit

相關問題