0

我是 Objective-C 编程的新手,我遇到了典型的内存问题。我必须做一个基于导航控制器的应用程序,并且在传递少量视图时(使用推送视图控制器),加载 100 个图像的动画。在模拟器中效果很好,但在手机上却不行……我打开了不同的动画,然后它就关闭了。我正在使用 arc 来避免这种情况,但它似乎不起作用。我也尝试禁用弧并手动释放 UIImageView 但它甚至很快崩溃。这是其中一个视图的示例:

    //.h
@interface Gegant_nou : UIViewController {

IBOutlet UIImageView *ImageViewGegant; 
}

@property (nonatomic, strong) UIImageView* ImageViewGegant;

//.m

- (void)viewDidLoad {

    [super viewDidLoad];


    UIBarButtonItem *rigthButton = [[UIBarButtonItem alloc] initWithTitle:@"Detalls" style:UIBarButtonItemStyleBordered target:self action:@selector(canviarDetalls)];
    self.navigationItem.rightBarButtonItem = rigthButton;
    [rigthButton release];


    ImageViewGegant.animationImages =@
        [[UIImage imageNamed:@"0001.png"],
        [UIImage imageNamed:@"0002.png"],
        . load all the images
        .
        [UIImage imageNamed:@"0099.png"],
        [UIImage imageNamed:@"0100.png"]];

    ImageViewGegant.animationDuration = 4;
    ImageViewGegant.animationRepeatCount = 0;
    [ImageViewGegant startAnimating];
    [self.view addSubview:ImageViewGegant];

    self.title = @"Gegant nou";

    [ImageViewGegant release];

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.

}

- (void)viewDidUnload{
    [super viewDidUnload];
    [ImageViewGegant release];
}

知道为什么会发生吗?感谢你们对我的帮助!

4

2 回答 2

1

如果您提供一些崩溃日志或堆栈跟踪以提供有关问题所在的更多信息,那么为您提供帮助会更容易。

您完全确定问题与内存有关吗?由于您使用的是 ARC,除非您有部分代码库不使用 ARC,或者如果您使用 CoreGraphics 等 c 库,即使您使用 ARC,您仍然需要保留/释放。

如果你确实有说过度释放的内存问题并且你得到一个 EXC_BAD_ACCESS 崩溃,你可以尝试通过 Product -> Edit scheme.. -> Diagnostics 然后“Enable Zombie objects”在你的应用程序中启用僵尸。这有望提供有关导致问题的对象的更多信息。

在一个完全不同的主题上,我强烈建议你用驼峰写法编写所有实例变量。读起来很混乱,大多数开发人员会认为“ImageViewGegant”是一个类的名称。

于 2012-09-29T19:05:53.753 回答
0

问题解决了!发生的事情是我使用 UIImageNamed 加载动画,虽然我使用的是 ARC,但 UIImageNamed 加载图像但不释放它,所以它加载所有帧并很快填满内存。现在我没有那个记忆问题了。谢谢大家!

于 2012-10-06T19:57:30.820 回答