2010-11-19 14 views
9

私は、iOSのメモリ管理に関するいくつかの基本的な理解が不足していると確信しています。iOSシングルトンとメモリ管理

私は、現在サインインしているユーザーに関する情報、複数のView Controllerからアクセスされた情報など、私のアプリでシングルトンを使用しています。アプリ全体で取得および設定される複数のivarsがあります。

@property (non atomic, retain) NSString *myString; 

と実装にsynththesized:

NSString *myString; 

と作られていますので、同様に保持:そうは次のように彼らは.hファイルで宣言され、有産ています。

私が取得し、このようにシングルトンにする方法でそれらの値を設定します。私はシングルトン含む他の場所で

myString = @"value"; 

methodLocalString = myString; 

- あるCurrentUserそれを呼び出すを - Iインポートする:

#import "CurrentUser.h"  

シングルトンの外側このようにそれを設定します。値が

[CurrentUser sharedCurrentUser].myString = @"Bob"; 

、これは素晴らしい作品の時間のほとんど

myOutsideString = [CurrentUser sharedCurrentUser].myString; 

は、適切に1が取得または別の設定から持続しました。問題は、時々私がそれらを得るときに、私は彼らがリリースされたことを知っている(アプリケーションをクラッシュさせる)、NSZombieEnabledは感謝して私に教えてくれます。

私が得意としないことは、彼の起こりうることです。シングルトンがリリースされていないと思ったので、シングルトンの保持された特性は決して解放されませんでした。この問題は、NSDateなどの非実在オブジェクトのプロパティや、保持できないintやBOOLなどのオブジェクトの明確なプロパティでは一般的ではないようですが、オブジェクトのプロパティでも同様に発生します。

私はここで何を知らないのですか?そして、あなたの忍耐力に感謝します。

+0

良い質問です。明確化を待っている。 – harshalb

+1

'NSString'プロパティで' retain'を使わないでください。 'copy'を使います。 –

+0

not on copyに感謝します。これは、NSCopyingをサポートするすべてのオブジェクトに適しているはずです。 –

答えて

14

あなたの問題がある:私が取得し、このようなシングルトンのメソッド にその値を設定

:あなたはIVARに直接割り当てると

myString = @"value";

、代わりにプロパティー構文(self.myString = @"value")を使用すると、合成されたセッターメソッドをバイパスしています。つまり、retainは発生しません。

プロパティは魔法ではありません。彼らは "。"のためのちょっとした統語的砂糖です。アクセス、およびあなた自身の苦労を救うためのゲッター/セッターメソッドを合成したことがあります。

+0

これは完璧な感覚を作ります。ありがとうございます! –

0

Don't use singletons.あなたの現在の(@synthesize上retainオプションを仮定)

if (myString != newValue) { 
    [myString release]; 
    myString = [newValue retain]; 
} 

self.myString = @"value"; 

を合成setMyString方法のようなものを行います

[self setMyString:@"value"]; 

のためだけの省略形です問題は、シンプルなメモリ管理の誤解ですが、シングルトンパターンは長期的には頭痛の種になります。

+1

提案していただきありがとうございます。私は長所と短所について12件以上の記事を読んだことがあり、自分の選択に満足しています。 –

+2

一般に、iOSアプリのシングルトンは結局大きな頭痛を引き起こします。しかし、あなたが慎重であればそれらを使うことができます。しかし、あなたがしてはいけないことの1つは、あなたのシングルトンからの参照UIKit要素です。私は開発者が多くのプロジェクトでシングルトンの使用を見直しました。基本的に、シングルトンがUIKitオブジェクトやUIKitオブジェクトを参照する他のオブジェクトへの参照を保持しているときは、足で自分自身を撮影することになります。メモリリークツールは、このようなUIKitリークをキャッチしませんし、修正するのは難しい循環参照の混乱が残っています。 – MoDJ