2011-10-03 16 views
10

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

EDIT:私のコードでは、これは輝きを生成するために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]; 

輝きのオブジェクトコード:ARCで

#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 

答えて

3

それでもCoreFoundationのオブジェクトを保持し、解放することができますが、あなたはNB(、deallocrelease、またはretainを呼び出すことはできません:あなたはdeallocメソッドを実装することができます独自のカスタムサブクラスの場合はsuper deallocにコールすることはできません)。だから簡単な答えは「いいえ」ですが、残念ながらARCを使用しているときに手動でオブジェクトを解放することはできません。

理論上、オブジェクトを参照しなくてもリリースされるはずだから、リリースされていないことを確かめてください。これらのオブジェクトを作成したら、これらのオブジェクトではどうしますか?あなたは単にそれらを作成し、すぐにそれらを破壊するだけですか?

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

+0

質問に自分のコードを追加しました。 – icant

+0

あなたはオブジェクトを 'nil'に設定できませんか?私はループの中に多くのNSArrayとDictionaryオブジェクトを構築しているので、グローバル配列に追加するので心配しています。そのあとでそれらを必要としません。ループ内に構築されたオブジェクトをARCが削除する方法は? – applefreak

+1

これはそれほど効果的ではありません。forループ内にオブジェクトを作成し、それらをグローバル配列に追加する場合、オブジェクトは保持されます。それらはグローバル配列から削除されるまで解放されません(つまり、保持カウントはゼロです)。 – lxt

4

私は答えを見つけましたが、実際は本当に馬鹿でした。私はスーパービューからの輝きを取り除かなかった。今、私はタイマーで0.8秒後にそれらを削除し、それが再び偉大な行い:)

+3

素晴らしい - おそらく推測できるように、スーパービューにビューが追加されてもまだ保持されているので、それはおそらく問題の根源でした。うれしいことは修正されました! – lxt

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

EDIT:オブジェクトが解放されたときは、直接コントロールすることはできませんが、あなたは間接的にそれが起こることがあります。どうやって? ARCが正確に行うことを覚えておいてください。人間のコーディング規則とは異なり、ARCはあなたのコードを解析し、リリースされたままのリリース文を挿入します。これにより、すぐに新しい割り当てのためのメモリが解放されます。これは素晴らしい/必要です。 意味、オブジェクトをnilに設定する、または単に変数をスコープから外すことを許可する...何かが発生した場合0 RETAIN COUNTはARCにリリース呼び出しを強制します。 そうでなければリークするので...。

+2

+1は有益で理解できる答えです。 – piperchester

+0

これはすべての場合に当てはまるわけではありません。特定のコンパイラの最適化が有効になっていない場合(通常はリリースモードで実行していない場合)、ARCはオブジェクトをただちに解放しません。 –

+0

nilに設定するのは、通常、ポインタがぶら下がるのを避けるために、オブジェクトがおそらくdeallocされた後に実行されます。どのようにしてnilに設定すると、最終的にデアロックが発生するかもしれませんか?原因と効果の逆転のように見えます。 –

5

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

関連する問題