11

iOS 5 SDK を使用して iOS アプリを開発しています。自動参照カウントが有効になっています。しかし、大量に作成されている特定のオブジェクトがあり、1 秒後に解放する必要があります。そうしないと、デバイスが非常に遅くなるからです。デバイスが非常に遅いため、リリースされていないようです。ARC が有効になっているときにオブジェクトを手動で解放する方法はありますか?

編集:私のコード、これはスパークルを生成するために1秒間に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

4 に答える 4

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

編集:オブジェクトがいつリリースされるかを直接制御することはできませんが、間接的にオブジェクトを発生させることはできます。どのように?ARCが正確に行うことを覚えておいてください。人間のコーディング規約とは異なり、ARCはコードを解析し、オブジェクトがリリースされるとすぐにリリースステートメントを挿入します。これにより、新しい割り当てのためにメモリがすぐに解放されます。これは素晴らしい/必要です。つまり、オブジェクトをnilに設定するか、単に変数がスコープ外になることを許可します... 0 RETAIN COUNTを引き起こす何かにより、ARCはリリース呼び出しをそこに配置します。そうしないと漏れてしまうので…。

于 2012-06-21T03:29:30.107 に答える
5

200 回呼び出されるコードのセクションを @autoreleasepool { ... } ステートメントで囲むだけです。これにより、コントロールがイベント チェーンを最上位の自動解放プールに戻るのを待つのではなく、すぐにメモリの割り当てが解除されます。

于 2013-03-29T04:13:51.297 に答える
4

私は答えを見つけました、それは実際には本当にばかげていました。スーパービューから輝きを削除しませんでした。今、私はタイマーで0.8秒後にそれらを削除し、再び素晴らしいパフォーマンスを発揮します:)

于 2011-10-03T15:13:21.697 に答える
3

ARCでは、 、、またはを呼び出すことはできませんが 、 CoreFoundation オブジェクトを保持および解放することはできます (注意:独自のカスタム サブクラスのメソッドを実装することはできますが、 を呼び出すことはできません)。したがって、簡単な答えは「いいえ」です。残念ながら、ARC を使用している場合、オブジェクトを手動で解放することはできません。deallocreleaseretaindeallocsuper dealloc

理論的には、オブジェクトを参照しなくなった場合は解放する必要があるため、それらが解放されていないことを確認してください。それらを作成したら、これらのオブジェクトをどうしますか? それらを作成してすぐに破棄するだけですか?

おそらく、使用しているコード/プロパティ宣言を投稿できます-これらweakまたはstrong参照されたオブジェクトですか?

于 2011-10-03T06:49:22.453 に答える