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

我正在使用iOS 5 SDK开发iOS应用程序,启用了自动引用计数。 但是,我有一个特定的对象,正在大量创build,必须在一秒之后才能释放,否则设备将变得非常慢。 看起来他们没有被释放,因为设备非常慢。 有没有办法手动释放一个对象时启用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 

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

编辑:你不能直接控制对象何时被释放,但你可以间接导致它发生。 怎么样? 记住什么是ARC做的。 与人类编码约定不同的是,ARCparsing你的代码并插入发布语句即可发布对象。 这可以立即释放新分配的内存,这是非常好的/必要的。 意思是,将一个对象设置为零,或者只是允许一个variables超出范围…引起一个0 RETAIN COUNT的事情迫使ARC将释放调用放在那里。 它必须…因为否则会泄漏。

只需用@autoreleasepool {…}语句围绕将要被调用200次的代码部分即可。 这将导致内存立即释放,而不是等待控件一路将事件链备份到顶层自动释放池。

我find了答案,其实是很愚蠢的。 我没有删除superview闪闪发光。 现在,我用一个定时器0.8秒后将它们删除,它再次performance很好:)

虽然你仍然可以保留和释放CoreFoundation对象(注意:你可以为你自己的自定义子类实现dealloc方法,但是你不能调用super dealloc ),但是你不能调用 deallocreleaseretain 。 所以简单的答案是'不',你不幸的是不能在使用ARC时手动释放一个对象。

我会仔细检查你确定他们没有被释放,因为从理论上讲,如果你不再引用一个对象,它应该被释放。 一旦你创build了这些对象,你会怎么做? 你只需创build它们,然后立即销毁它们?

也许你可以发布你使用的代码/属性声明 – 这些weakstrong引用对象?