2011-03-04 85 views
0

我了解一些这方面的材料,那我就写了一个简单 应用程序,但糊涂了,这里是(使用cocos2d的模板)样本:内存管理上的NSMutableArray

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中” init方法:

-(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]; 

而且在methoed正如你所看到的注释行的FUNC2发布SpriteObject。

但该应用程序崩溃。

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

然后我在return语句中删除了两个autorelease,它的工作原理是 。

有人可以根据上面的代码给一些建议? 在此先感谢。

回答

1

哦,男孩,有多个问题。首先记得发布一切你称之为“alloc,new,retain,copy”的东西。请参阅Objective C release, autorelease, and data typesRelease, Dealloc, and the Self reference

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

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

array = ...;

[array release];

因此,您创建一个内存泄漏,并获得双发布的麻烦。请参阅obj-c NSString and alloc/retain/release了解如何正确执行此操作。