我了解一些这方面的材料,那我就写了一个简单 应用程序,但糊涂了,这里是(使用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,它的工作原理是 。
有人可以根据上面的代码给一些建议? 在此先感谢。