内存管理示例

时间:2010-09-14 20:12:54

标签: iphone objective-c

这是我的一个课程中的一些代码,我想知道我是在处理内存还是在任何地方泄漏?

@implementation CardViewController
@synthesize playerImage;
@synthesize cardLabel;
@synthesize card;
@synthesize frontView;
@synthesize backView;
@synthesize nameLabel;
@synthesize infoLabel;
@synthesize delegate;

-(void) initialiseButtons 
{
NSLog(@"initialiseButtons  %d",totalButtons);
int ypos = playerImage.frame.origin.y + playerImage.frame.size.height + 42;
for(int i=0; i<totalButtons; i++) 
{       
    StatView *sv = [[StatView alloc] initWithYPos:ypos];
    sv.tag = 100 + i;
    [sv.overlayButton addTarget:self action:@selector(statTapped:)    
                 forControlEvents:UIControlEventTouchUpInside];
    sv.overlayButton.tag = 10 + i;
    [self.frontView addSubview:sv];
    ypos += 26;
}
}

-(IBAction) statTapped:(id) sender 
{

UIButton *tappedButton = (UIButton *)sender;
int tag = tappedButton.tag;
if(delegate && [delegate respondsToSelector:@selector(cardTapped:)]) {
    [delegate cardTapped:tag-10];
}
 }

-(void) viewDidLoad 
{
NSLog(@" viewDidLoad CVC");
[self initialiseButtons];

metaData = [[NSArray alloc]     
      initWithObjects:@"Height",@"Weight",@"Games",@"Attack",@"Defense", nil];
 }

-(void) setCard:(Card *)newCard 
{
NSLog(@"setCard");
[card release];
card = [newCard retain];
[self updateUI];
}

- (void)dealloc 
{
[card autorelease];
[metaData autorelease];
 [super dealloc];
}

@end

我应该在哪里发布StatView * sv = [[StatView alloc] initWithYPos:ypos]; 如果我发布它,每个循环都不会导致问题? 除此之外我还能处理其余的内存吗?

由于 -code

4 个答案:

答案 0 :(得分:1)

是的,当您将它插入到视图层次结构中时,应该在每次循环迭代结束时释放该StatView。

答案 1 :(得分:1)

你应该尝试在XCode中内置的分析器,因为它非常擅长发现这些类型的内存泄漏。有一个look

答案 2 :(得分:0)

您应该在将其添加到视图层次结构后立即将其释放(通过使用新分配的视图作为参数发送addSubview:)。这是因为UIView对象保留了它们的子视图。

我注意到另一个问题:你的setCard方法应首先检查新旧卡是否相同,在这种情况下什么也不做。否则,您可以释放现有的卡,然后尝试再次保留,只是发现它已被解除分配。

答案 3 :(得分:0)

  1. 在此行之后发布新的StatView

    [self.frontView addSubview:sv];

    [sv release]; // frontView retains sv

  2. retain中发布声明为copydealloc的所有媒体资源。候选属性:playerImage,cardLabel等。发送release消息,而不是autorelease

    \\[card autorelease];

    [card release];

  3. viewDidUnload中发布声明为IBOutlet的所有属性,并将变量设置为nil

    [frontView release], frontView = nil;