Objective c 我如何在目标C中创建和填充NSArray有什么问题?

Objective c 我如何在目标C中创建和填充NSArray有什么问题?,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,我使用cocos2d填充一个NSMutable数组,然后从该数组创建一个NSArray。我使用不同的数组名称连续执行以下代码3次,第三次Instruments报告我添加到数组中的每个元素的泄漏 奇怪的是,并不是每次创建和添加CCSprite时都会出现这种情况,每次运行应用程序时,它抱怨的内容都不一样。我做错了什么?有更好的方法吗 这是我的密码: NSMutableArray *tempNumberArray = [[NSMutableArray alloc] init]; tempSprite

我使用cocos2d填充一个NSMutable数组,然后从该数组创建一个NSArray。我使用不同的数组名称连续执行以下代码3次,第三次Instruments报告我添加到数组中的每个元素的泄漏

奇怪的是,并不是每次创建和添加CCSprite时都会出现这种情况,每次运行应用程序时,它抱怨的内容都不一样。我做错了什么?有更好的方法吗

这是我的密码:

NSMutableArray *tempNumberArray = [[NSMutableArray alloc] init];

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release];
tempSprite = nil;


tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release];
tempSprite = nil;

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release];
tempSprite = nil;

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release]; 
tempSprite = nil;

self.numbersArray = [NSArray arrayWithArray:tempNumberArray];
[tempNumberArray release];
tempNumberArray = nil;
编辑:谢谢你看这个。 第一次使用tempSprite时,我将其初始化为:

CCSprite * tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release]; 
tempSprite = nil;

我在每个分配之间释放tempSprite,因为否则它会泄漏。[tempNumberArray addObject:tempSprite]保留精灵对象。

我不确定您为什么会看到泄漏。您发布的代码是正确的,尽管没有必要每次都将
tempsrite
设置为
nil
;只有在释放对象后可能会使用指针尝试向其发送消息时,才需要执行此操作。然而,这不会伤害任何东西

我建议的唯一改进是在循环中进行阵列构造:

// You can also use an autoreleased mutable array, since you don't need it
// to stick around after construction.
NSMutableArray * tempNumbersArray = [NSMutableArray array];
int i;
for( i = 0; i < NUM_OF_SPRITES; i++ ){
    CCSprite * tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
    [tempNumbersArray addObject:tempSprite];
    [tempSprite release];
}

self.numbersArray = [NSArray arrayWithArray:tempNumbersArray];
//您也可以使用自动释放的可变数组,因为您不需要它
//施工后留下来。
NSMutableArray*tempNumberArray=[NSMutableArray];
int i;
对于(i=0;i
tempSprite的初始化代码是什么?为什么要发布tempSprite?如果你释放了它们,它们就不会出现在你的数组中。@Luke:数组保留了添加的对象。释放使用alloc创建的对象是正确的,以便在重用指针时不会泄漏。这是否与
[NSArray arrayWithArray:tempNumberArray]
创建数组的?(仔细想想,可能不会,因为
numbersArray
属性设置程序将保留它,对吗?)是的,self.numbersArray设置程序将保留它,正确。感谢您提供有关使用for循环清理代码的建议。这很有道理,我想我会的!我必须在代码中的其他地方查找我得到的错误。