私はこのコードを実行すると?あなたがプロパティにそれを保存している場合、私はARCNSTimerのメモリ管理
答えて
はい、NSTimer
は、(特にリピートタイマーで)強い基準サイクル(特にリピートサイクル)を引き起こす可能性があるtarget
への強い参照を維持します。あなたの例では、タイマーは繰り返されず、遅延が0.5にすぎないため、最悪の場合のシナリオでは、0.5秒で自動的に解決される強力な参照サイクルになります。
しかし未解決の強い基準サイクルの一般的な例は、繰り返しNSTimer
プロパティとUIViewController
を持っているであろうが、NSTimer
はUIViewController
への強い参照を持っているので、コントローラは保持されてしまうであろう。
したがって、NSTimer
をインスタンス変数として保持している場合、強い参照サイクルを解決するには、invalidate
とする必要があります。 scheduledTimerWithTimeInterval
を呼び出すだけでインスタンス変数に保存していない場合(例のように)、NSTimer
が完了すると強力な参照サイクルが解決されます。
そして、あなたはNSTimers
を繰り返すことを扱っている場合は、強力な基準サイクルが解決されるまでdealloc
は明らかに呼び出されませんので仕方によって、NSTimer
の所有者のdealloc
にinvalidate
にそれらをしようとしないでください。例えば、UIViewController
の場合、viewDidDisappear
で行うことができます。
ちなみに、Advanced Memory Management Programming Guideは、強い参照サイクルが何であるかを説明しています。明らかに、弱い参照の適切な使用を説明しているセクションにありますが(これはNSTimer
がターゲットへの強い参照を使用しているという事実を制御できないためです)、ここでは該当しませんが、強力なリファレンスサイクルがうまくいきます。
あなたのNSTimer
はMacOSの10.12とiOS 10で、self
への強い参照を保持するために、以降、あなたはブロック表現を使用して、weakSelf
パターンを使用することができますしたくない場合は、次の
typeof(self) __weak weakSelf = self;
[NSTimer scheduledTimerWithTimeInterval:0.5 repeats:false block:^(NSTimer * _Nonnull timer) {
[weakSelf showButtons];
}];
ところで、私はあなたがshowButtons
と呼んでいることに気付きました。あなたは自分のビューにいくつかのコントロールを表示しようとしている場合、あなたは完全にNSTimer
の使用を排除し、のような何かができる:これはNSTimer
オブジェクトの保持の問題を受けて、両方を実行しない
self.button1.alpha = 0.0;
self.button2.alpha = 0.0;
[UIView animateWithDuration:0.25
delay:0.5
options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
animations:^{
self.button1.alpha = 1.0;
self.button2.alpha = 1.0;
}
completion:nil];
1つのステートメント内でのボタンの遅延と表示が優雅に表示されます。showButtons
メソッドで追加の処理を行っている場合は、completion
ブロックに追加することができます。
を使用しています
、[はい、あなたはそれがセレクタを発射した後、ゼロに設定する必要があります。
あなたのクラスが何らかの理由で割り当て解除される場合に備えて、それを保存することも安全です。必要な場合は[timer invalidate]
にすることができます。
に、あなたがする' nil'それ自身はありませんが。 (反復していないと仮定して)発火後に自動的に解放されます。 – Rob
はい、あなたは使用することができます。myTimer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(showButtons) userInfo:nil repeats:NO];
そして、あなたはそのプロパティ `weak`を作る場合、あなたのviewDidDisappear [myTimer invalidate]
- 1. NSTimerメモリ管理の質問
- 2. コアデータ - メモリ管理?
- 3. UIViewメモリ管理
- 4. AS3 - メモリ管理
- 5. iPhoneメモリ管理
- 6. メモリ管理addSubview:
- 7. mipsメモリ管理
- 8. MVC3メモリ管理
- 9. CGMutablePathRefメモリ管理
- 10. @properties - メモリ管理
- 11. UITableViewメモリ管理
- 12. ADBannerViewメモリ管理
- 13. iPhone:メモリ管理
- 14. メモリ管理ios
- 15. アレイ、メモリ管理
- 16. Netbeansメモリ管理
- 17. CFSTRメモリ管理
- 18. iOSメモリ管理
- 19. OSメモリ管理
- 20. 未管理オブジェクトのメモリ管理
- 21. イベントマシンのメモリ管理
- 22. iPhoneのメモリ管理
- 23. Windowsのメモリ管理
- 24. iPhoneのメモリ管理
- 25. iPhoneのメモリ管理
- 26. iPhoneのメモリ管理
- 27. コンテナクラスのメモリ管理
- 28. hDCのメモリ管理
- 29. NSDictionaryのメモリ管理
- 30. iOSのメモリ管理
偉大な答えですが、実際にはNSTimer *タイマーの.hファイルで実際にdeclereしていないということを明確にしていないかもしれません。.mファイルにそのコードを追加するだけで、無効にしたり、 。この場合、タイマーを使用してもOKですか、または私が提供したコードを使用する方が良いですか? – Alessandro
@Alessandro私は実際にあなたがタイマーのために象牙を維持していないと推測しました。しかし、明らかに、 'viewWillDisappear'で' invalidate'をしたいのであれば、そうする必要があります。 (さて、あなたは.hにプライベートイーバールを置く必要はありません;プライベートクラスの拡張はより良いです)。そして、あなたは 'NSTimer'を' nil'に設定することに関して言及しました。これは強い基準サイクルを解決しないことに注意してください。タイマーは完了する必要があります(繰り返されません)か、またはあなたは新しいイールを使って '無効にする'必要があります。 – Rob