2009-04-04 14 views
5

私は、viewDidLoadとviewWillAppearの間を移動するときに無効になるプロパティを持っています。なぜそれが起こるのか分かりません。NSStringプロパティが無効な値に変更されるのはなぜですか?

私は自分のデータベースへのパスを取得するヘルパークラスを持っています。私はこのクラスをアプリケーションデリゲートに割り当てます。 RootViewControllerは、このようなappDelegateへの参照を取得します。appDelegate以上

//inside .h file 
@interface RootViewController : UITableViewController 
<UITableViewDelegate, UITableViewDataSource>{ 
NSArray *controllers; 
myAppDelegate *appDelegate; 
} 

//inside .m file 
@implementation RootViewController 
@synthesize controllers; 

- (void)viewDidLoad { 
appDelegate = [[UIApplication sharedApplication] delegate]; 

self.controllers = appDelegate.topicControllers; 
[super viewDidLoad]; 
} 

Iマウスデータベースヘルパークラスとデータベース・パスを含むプロパティを見つける:

NSPathStore2 * appDelegate.databaseHeper.databasePath "/Users/userA/Library/Application Support/iPhone Simulator/User/Applications..." 

databasepathには、NSStringの宣言されています。なぜNSPathStore2に変更されたのですか?

私がデバッガで続行すると、他の奇妙なことが起こります。 viewWillAppearに入ると、プロパティ値は「無効」になり、タイプはNSStringに戻ります。私はそこにUIButtonを見たことがあります。

なぜ無効になるのですか?私はもはや変数を使用することはできません。

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; //changes before this line executes 
} 

私はviewDidLoadとviewWillAppearの間に何もしません。ここでdatabasepathには、以前のapplicationDidFinishLaunchingに発生しdatabaseHelperクラスに割り当てられている方法です。

- (NSString *) getDBPath { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
return [documentsDir stringByAppendingPathComponent:self.databaseName]; 
} 

stringByAppendingPathComponent NSStringのを返します。 NSStorePath2を割り当てられた後、いつの間にかダウンロードするのはなぜですか?

私は今問題なく動作していますが、[databaseHelper getDBpath]を呼び出すだけです。私の目標は、いくつかのCPUサイクルを節約し、その価値を保存することです。したがって、databasePath。 databasePathが無効になる理由を教えてください。

+0

なぜdownvotesですか?これは、たくさんのアップフォースを受け取る貧しい質問の数よりも良い質問です! –

答えて

5

値を保持していないためです。いつ何かを保持する必要があるかどうかを確認するには、Memory Management Programming Guideのルールを確認してください。

もちろん、cdespinosaのメモとして、最初にこのパス名をキャッシュする必要はありません。それはおそらく大きなパフォーマンスを殺す人ではありません。最初にプロファイル、、次にホットスポットを最適化します。

+0

databasePathの実装が表示されていないときに私が保持していないことを推測する方法はありますか?ここに実装があります:@property(非原子的、保持)NSString * databasePath; – 4thSpace

+1

これがその症状を引き起こす原因です。あなたのオブジェクトは、あなたがそれを保持しなかったために死亡したか、別のオブジェクトに置き換えられました(そしてそれを保持しませんでした)。または、あなたはそれを過剰にリリースしましたが、それはあまりありません。 @propertyについて:あなたは実際にプロパティを使用していますか、またはivarに直接割り当てていますか? –

+0

>> ...またはivarに直接割り当てるのですか?<<それが問題でした。 databaseHelperでは、self.databasePathではなくdatabasePathを割り当てていました。後者はその価値を保持します。違いは何ですか?そして大きな感謝! – 4thSpace

3

NSStorePathではなくNSPathStore2を意味すると思います。

NSPathStore2はNSStringの内部プライベートサブクラスであり、文字列がファイルシステムパスとして認識されるサブシステム間で使用されます。それはあなたが気にするすべての方法でNSStringと機能的に同等です。

あなたの投稿からは、そのクラスが何であるか疑問に思う以外に問題があるのか​​、それをキャッシュすることによって得られる最適化があるかどうかは不明です。答えはおそらく、データベースにアクセスする際にCPUサイクルを使用するすべてのもののうち、そのファイルシステムパスへのアクセスはおそらくリストの最後になるでしょう。

+0

私はあなたの最後の段落を理解できませんでした。なぜなら、あなたの価値が無効に変わったことが問題ではないと思われる理由です。私はうまくいっていることを明確にするために投稿を編集しました。どうして-1票があるのか​​分かりません。 – 4thSpace

+0

無効にはなりませんでした。それは何にもなりませんでした。 "NSPathStore2はNSStringの内部プライベートサブクラスです" - つまり、そのオブジェクト*は* NSStringです。これはNSStringの直接のインスタンスではありません。これはサブクラスのインスタンスです。これは十分です。ほかのNSStringと同じように扱います。 –

+0

問題は、私がdatabaePathのパスを期待していることです。しかし、パスとして使用する場合は、代わりに「無効」の値を取得します。何らかの理由でパスの値が消えてしまった。あなたはNSStringとNSPathStore2の定義を与え続けますが、これは私が求めているものではありません。 – 4thSpace

関連する問題