2011-09-04 33 views
1

我在.m文件中有這樣的代碼,它是一個Cocos 2D CCLayer類。我在init方法中初始化一個數組,然後嘗試在nextFrame方法中使用這個數組的內容。但是,當調用nextFrame方法時,數組的內容看起來是空的。當我試圖得到第一個項目,我收到一條錯誤消息說:可變數組內容在方法之間丟失

程序接收到的信號「EXC_BAD_ACCESS」

我怎樣才能順利地訪問我nextFrame方法這個數組的內容?

NSMutableArray *cars; 

-(id) init { 
    cars = [NSMutableArray array]; 
    Car *car; 
    car = [[Car alloc] init]; 
    [cars addObject:car]; 
    self.isTouchEnabled = YES; 
} 

- (void) nextFrame:(ccTime)dt { 
    Car *car = [cars objectAtIndex:i]; // Program received signal "EXC_BAD_ACCESS" 
} 

Car.h

#import <Foundation/Foundation.h> 
#import "cocos2d.h"; 

@interface Car : NSObject { 
    NSInteger type; 
    CCSprite *sprite; 
} 

@property (readwrite, assign) NSInteger type; 
@property (retain) CCSprite *sprite; 

@end 

Car.m

#import "Car.h" 

@implementation Car 

@synthesize type; 
@synthesize sprite; 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

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

@end 
+1

cars = [NSMutableArray array]; // - >看起來像自動釋放的對象。將其更改爲cars = [[NSMutableArray alloc] init];如果數組的內容丟失,則訪問objectAtIndex:將導致SIGABRT出現異常NSRangeException。您正在訪問發佈的對象,以便EXC_BAD_ACCESS。 – 0x8badf00d

回答

4

你分配的[NSMutableArray array]結果實例變量。這是一個自動釋放的對象,基本上意味着它沒有任何所有者,因此在當前的循環迭代*之後可以自由地離開。如果你希望它堅持下去(或者只是使用[[NSMutableArray alloc] init],它會返回一個你自己擁有的對象),你需要保留它。

* 基本上。您應該看到Cocoa memory mangement guide瞭解更多詳情。這很短,但充滿了重要的信息。

+0

我明白了,謝謝。有效。 –

+1

說當前runloop迭代後可以自由選擇,這有些誤導。從objc-language郵件列表引用OndřejČada:「保證的生存期是當前範圍的結束(包括它的返回值,如果有的話)。沒有更多(對於外部可以有嵌套池)。」 – dreamlax

+0

我認爲這樣說不是誤導。這僅僅意味着你不能說出它會在多長時間內。正如您所引用的,只保證當前範圍(包括返回值)。 –