4

それで、Instruments で NSZombiesEnabled と NSZombies を使用して、狂ったようにデバッグしてきました。ただし、ゾンビを使用してアプリを実行すると、問題が解決するようです。楽器で NSZombiesEnabled または NSZombies なしでアプリを実行すると、アプリがクラッシュします。これに対処する方法について何か考えはありますか?

問題は、私が何かを 2 回リリースしていることですが、どこでこれを行っているのかがわかりません。NSZombieEnabled をオンにしても、プログラムが正常に実行されるため、解放された場所を教えてもらえないため、役に立ちません。

だから私はそれがクラッシュしている場所を知っていると思います.私が作成しているこのglobalArrayシングルトンクラスがあります:

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

コードのある時点で、配列内のすべてのオブジェクトを削除してから、いくつかのものを追加しようとしています。そのときにクラッシュが発生しました。

コードのこの部分は、2 回目の実行時にクラッシュします。

 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];
                 }
4

3 に答える 3

3

メソッドで[super dealloc] 最初に行うべきではありません。最後-deallocに来る必要があります。

于 2012-05-22T00:16:48.973 に答える
1

割り当てが解除されたオブジェクトにメッセージが送信されると、アプリがクラッシュします。NSZombiesEnabledは、割り当てが解除されたすべてのオブジェクトを保持するため(したがって、すべてをリークするため)、アプリがクラッシュするのを防ぎます。割り当て解除されたオブジェクトにメッセージが送信されると、コンソールにメッセージが出力されます(通常はアプリがクラッシュします)。「メッセージ'bar'が割り当て解除されたオブジェクト'foo'に送信されました」(またはそのようなもの)の影響を受けるもの。実際にアプリの実行を一時停止することはありません。

アプリが一般的にクラッシュすることがわかった時点を過ぎたら、コンソールログで上記のようなメッセージを確認してください。

于 2012-05-21T21:36:21.700 に答える
1

製品 -> 分析に進みます。表示されるメッセージは、解決策またはアイデアを提供します。

于 2012-05-21T21:27:57.023 に答える