iOS:如何在启用ARC的情况下从内存中删除对象?

时间:2011-10-03 06:23:02

标签: ios automatic-ref-counting

我正在使用iOS 5 SDK开发iOS应用程序,启用了自动引用计数。但我有一个特定的对象正在大量创建,必须在一秒钟之后释放,否则设备将变得非常慢。看起来它们没有被释放,因为设备非常慢。有没有办法在启用ARC时手动释放对象?

编辑:我的代码,每秒调用200次以产生闪光。它们在0.8秒后逐渐消失,因此在那之后它们没用了。

    int xanimationdiff = arc4random() % 30;
    int yanimationdiff = arc4random() % 30;
    if (arc4random()%2 == 0) {
        xanimationdiff = xanimationdiff * -1;
    }
    if (arc4random()%2 == 0) {
        yanimationdiff = yanimationdiff * -1;
    }

    Sparkle *newSparkle = [[Sparkle alloc] initWithFrame:CGRectMake(20 + arc4random() % 280, 20, 10, 10)];
    //[newSparkle setTransform:CGAffineTransformMakeRotation(arc4random() * (M_PI * 360 / 180))]; //Rotatie instellen (was niet mooi, net sneeuw)
    [self.view addSubview:newSparkle];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.8];
    [newSparkle setFrame:CGRectMake(newSparkle.frame.origin.x - xanimationdiff, newSparkle.frame.origin.y - yanimationdiff, newSparkle.frame.size.width, newSparkle.frame.size.height)];
    newSparkle.alpha = 0;
    [UIView commitAnimations];

闪光对象代码:

#import "Sparkle.h"

@implementation Sparkle

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"sparkle.png"]]];
    }
    return self;
}

@end

4 个答案:

答案 0 :(得分:50)

Object* myObject = [[Object alloc] init];     
myObject = nil; // poof...

编辑:您无法直接控制对象何时被释放但您可以间接导致它发生。怎么样?记住ARC确实做了什么。与人类编码约定不同,ARC会解析您的代码并插入发布语句,因为即使是对象也可以发布。这样可以立即释放内存以进行新的分配,这非常棒/必要。  意思是,将对象设置为nil,或者只是允许变量超出范围......导致A 0 RETAIN COUNT的事情迫使ARC在其中放置其释放调用。  它必须......因为否则会泄漏。

答案 1 :(得分:5)

使用@autoreleasepool {...}语句围绕将要调用200次的代码部分。这将导致内存立即被释放,而不是等待控件一直向上返回事件链到顶级自动释放池。

答案 2 :(得分:4)

我找到答案,实际上真的很蠢。我没有从superview中删除闪光。现在我用定时器在0.8秒后移除它们,它再次表现很好:)

答案 3 :(得分:3)

使用ARC,您无法调用 deallocreleaseretain,但您仍然可以保留和释放CoreFoundation对象(注意:您可以实现{ {1}}您自己的自定义子类的方法,但不能调用dealloc)。因此,简单的答案是“不”,遗憾的是,在使用ARC时,您无法手动释放对象。

我会仔细检查你确定它们没有被释放,因为理论上如果你不再引用一个物体它应该被释放。创建它们后,如何处理这些对象?你只需创建它们然后立即销毁它们?

也许您可以发布您正在使用的代码/属性声明 - 这些super deallocweak引用的对象是什么?