-1

メモリに問題がある場合は、次のようなコードがあります。

EXC_BAS_ACCESS を持っている

@interface MapList : NSObject
{
    NSArray* m_units;
}
-(MapList*) loadMapListWithLevel:(uchar) lvl chapter: (uchar) chapt;
-(void) dealloc;
@end

と実装:

-(MapList*) loadMapListWithLevel:(uchar) lvl chapter: (uchar) chapt
{
    self =[super init];
    if (self)
    {
         {
            ...

            NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:size];

            for (uint j=0;j<size;j++)
            {
                obj =[[SpriteDB alloc] init];
                [array addObject:obj];
                [obj release];
            }
            if (i==0)
                m_units = [NSArray arrayWithArray:array];

            [array release];
        }
        ...
    }
    return self;
}

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

そして、ある方法では、私はそれらをこのように呼び出します

MapList* mpl = [[MapList alloc] loadMapListWithLevel:level chapter:chapter];
[mpl release];

問題はどこですか?コメント[m_units release];するとうまくいきます...

4

1 に答える 1

2

m_units = [NSArray arrayWithArray:array];自動解放された値を提供します。2 回目のリリースを行うと、このオブジェクトは過剰にリリースされます。runloop が戻った後でこの値にアクセスしても、メモリの問題が発生します。この値を保持し、dealloc で解放します。また、プロパティを使用する必要があります。

于 2012-08-30T18:48:52.077 に答える