【问题标题】:Memory Management on NSMutableArrayNSMutableArray 上的内存管理
【发布时间】:2011-03-04 01:47:24
【问题描述】:

我阅读了一些关于此的材料,然后我尝试写一个简单的 app 但有点困惑,这里是示例(使用 cocos2d 模板):

MySpriteObject 类:

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

@interface MySpriteObject : CCNode {
    CCSprite *mySprite;
    NSString *spriteInfo;
}

@property(nonatomic,retain) CCSprite *mySprite;
@property(nonatomic,retain) NSString *spriteInfo;
@end


#import "MySpriteObject.h"

@implementation MySpriteObject
@synthesize mySprite;
@synthesize spriteInfo;

-(id) init
{
    NSLog(@"MySpriteObject init");
    if ((self = [super init])) {

        self.mySprite = [CCSprite spriteWithFile:@"Icon.png"];
        self.spriteInfo = [[[NSString alloc] initWithFormat:@"sprite info"] autorelease];
    }

    return (self);
}

-(void)dealloc
{
    NSLog(@"MySpriteObject dealloc");
    [self.spriteInfo release];
    [super dealloc];
}

@end

MyObjectManager 类:

#import "cocos2d.h"
#import "MySpriteObject.h"

@class MySpriteObject;
@interface MyObjectManager : CCNode {

}

+(MyObjectManager *)sharedMyObjectManager;
-(NSMutableArray *)func1;
-(NSMutableArray *)func2;

@end


#import "MyObjectManager.h"
#import "MySpriteObject.h"

@implementation MyObjectManager

static MyObjectManager *_sharedMyObjectManager = nil;

+(MyObjectManager *)sharedMyObjectManager
{
    NSLog(@"MyObjectManager sharedMyObjectManager");
    if (!_sharedMyObjectManager) {

        if( [ [MyObjectManager class] isEqual:[self class]] )
            _sharedMyObjectManager = [[MyObjectManager alloc] init];
        else
            _sharedMyObjectManager = [[self alloc] init];
    }

    return _sharedMyObjectManager;
}

-(id)init
{  
    NSLog(@"MyObjectManager init");
    if( (self = [super init]) ) {
    }
    return self;
}

-(void)dealloc
{
    NSLog(@"MyObjectManager dealloc");
    [super dealloc];
}

-(NSMutableArray *)func1
{
    NSMutableArray *array1 = [[NSMutableArray alloc] init];
    array1 = [self func2];
    return array1;
}

-(NSMutableArray *)func2;
{
    NSMutableArray *array2 = [[NSMutableArray alloc] init];
    for (int i = 0; i < 3; i++) {

        MySpriteObject *mySpriteObject = [[MySpriteObject alloc] init];
        [array2 addObject:mySpriteObject];

        //[mySpriteObject release];
    }
    return array2;
}
@end

并且在“HelloWorldScene.m”初始化方法中:

-(id) init
{
    if( (self=[super init] )) {

        NSMutableArray *array = [[NSMutableArray alloc] init];
        array = [[MyObjectManager sharedMyObjectManager] func1];
        for (int i = 0; i < array.count; i++) { 
            MySpriteObject *s = [[MySpriteObject alloc] init];
            s = [array objectAtIndex:i];
            NSLog(@"%@", s.spriteInfo);
            [s release];
        }
        [array release];
    }
    return self;
}

上面发布的代码工作正常(至少没有崩溃),但我认为有 内存泄漏。

起初,我让 fun1 fun2 方法返回这样的数组:

return [array1 autorelease];
return [array2 autorelease];

并在func2方法中释放SpriteObject,如注释行所示。

但是应用崩溃了。

然后我取消注释 SpriteObject 发布行,但它仍然崩溃。

然后我删除了return语句中的两个autorelease,它起作用了 很好。

有人可以根据上面的代码给出一些建议吗??? 提前致谢。

【问题讨论】:

    标签: memory-leaks nsmutablearray autorelease


    【解决方案1】:

    哦,男孩,有多个问题。首先记得释放所有你称之为“alloc、new、retain、copy”的东西。见Objective C release, autorelease, and data typesRelease, Dealloc, and the Self reference

    这里的基本问题是,您正在覆盖以前创建的变量。例如:

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

    数组 = ... ;

    [数组释放];

    因此,您会造成内存泄漏并遇到双重释放问题。请参阅obj-c NSString and alloc / retain / release 了解如何正确操作。

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 2010-10-02
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多