2009-07-25 11 views
1

NSString保持に関するいくつかの問題があります。私の問題は、2番目の関数(runItem)ではitem1の値を取得していないようです。私が何を設定しても、それはちょうどゼロに設定されているようです。私はCocoa(デスクトップ、iPhone)をプログラミングしています。以前はNSStringにこのような問題はありませんでした。私はそれを引き起こすために何をしているのか分からないので、誰かが私にこれを手伝ってもらえると本当に感謝します!NSString保持問題

@interface AppController : NSObject { 
    NSString *item1; 
} 
@property (retain) NSString *item1; 

- (IBAction)runItem:(id)sender; 

@end 

そしてAppController.m:

@synthesize item1; 

- (void)awakeFromNib: { 
    NSDictionary *savedFile = [NSDictionary dictionaryWithContentsOfFile:@"Users/me/Desktop/Testing.plist"]; 
    if (savedFile != nil) { 
     item1 = [savedFile objectForKey:@"Item Title"]; 
     AppController *runFunction = [[AppController alloc] init]; 
     [runFunction runItem:self]; 
    } 
    else { 
     item1 = nil; 
    } 
} 

- (IBAction)runItem:(id)sender 
    NSLog(@"%@", item1); 
} 

答えて

5

うーん、あなたが最初AppControllerオブジェクトにデフォルトから(それがNIBファイルに関連付けられていたため、アプリケーションによって作成されたもの)、あなたは、直接(AppControllerオブジェクトを作成しているがitem1を設定するものの " init "コンストラクタ)、そのitem1は設定されませんでした。そして、あなたはその2番目のオブジェクトのitem1を要求します。もちろん、それはnilです。

おそらく、オブジェクトが初期化されるたびにawakeFromNibが呼び出されると思うからでしょうか?しかし、これは完全に真実ではありません。 awakeFromNibは、NIBファイルがロードされたときに作成されるオブジェクトに対してのみ呼び出されます。

+1

これは正しいですが、 "awakeFromNib"にコロンはありません。 –

+0

newacct:それはかなり意味があります。私はそれを[self runItem:self]に切り替えました。ご協力いただきありがとうございます! – PF1

1

あなたが直接割り当てプロパティyou'reを通過されていないので、あなたは、それを保持していない私のAppController.hファイルに私のコードインスタンス変数に追加します。 self.item1 = [savedFile objectForKey:@"Item Title"]を使用して、プロパティの合成セッターを使用して値を設定します。

さらに、値がNSCodingに適合するプロパティの場合は、特に値が変更可能な場合はcopyでなく、retainを使用する必要があります。文字列はそのようなケースです:あなたは本当に他の誰かの変更可能な文字列を突き止めたいとは思わないのです。独自のコピーを作成したいので、文字列の値が他のオブジェクトの文字列に関係なく固定されたままになります。

+0

こんにちはPeter:あなたのアドバイスをありがとう。私はこれを将来考慮しています。しかし、この問題では、item1をどのように保持しても、それはまだ機能しません。私はitem1のすべてのインスタンスを "self.item1"に変更しましたが、これを変更してもまだ動作しません。 [item1 retain]を呼び出しても、それでも保持することは拒否されました。 – PF1

0

詳細が必要:あなたはawakeFromNibが呼び出されている

  • 知っていますか?
  • savedFileがnon-nilであることをご存知ですか?
  • savedFileの「Item Title」が存在し、非nilであることをご存知ですか?あなたの@property文で定義されているよう

また、単にitem1 = @"something"を呼び出すと、それが保持さにはなりません、あなたはそうあなたは、単に直接のポインタを設定している、使用される合成されたプロパティのself.item1 = @"something"を呼び出す必要があります。

+0

こんにちはNick: 1. awakeFromNibが呼び出されていて、NSLogステートメントでもう一度チェックしました。 2. "if(savedFile!= nil)"を実行してこれをチェックしたと思いますが、これについて間違っている可能性があります。 3.はい、その値がファイルに存在します。 また、self.item1部分については意味がありますが、これを追加してもまだ動作しません。また、試してみると、私は[item1 retain]と呼ばれ、そのように動作するかどうかを確認しました。だから私は何らかの理由で、あなたがそれをどのように呼んでも、それを単に保持していないと思っています。 – PF1

2

問題#1:あなたが提供した例では、次があります。

- (void)awakeFromNib: { 

NSNibAwakingプロトコルはawakeFromNibを定義します。最後にコロンがないことに注意することが重要です。極端にです。あなたのコード内のこのメソッドが実際に呼び出されている場合は、おそらく内部的な奇妙さに依存しているものではありません(あなたがそれを見つけることができない限り、私はできませんでした)。ドキュメントの私のクイックスキャンは、awakeFromNibが呼び出される唯一のセレクタだという。

問題#2:

NSDictionary *savedFile = [NSDictionary dictionaryWithContentsOfFile:@"Users/me/Desktop/Testing.plist"]; 

私はあなたが本当に何を意味するのか/Users、ないUsersたことをかなり確信しています。これは、おそらくが常にロードされるのでNULLであることを意味します。したがって、次のif()のチェックでは常にelseの条件が使用されます。

問題#3:あなたはGCを使用していない場合は、辞書savedFileから取得したオブジェクトが保持されていないので、

item1 = [savedFile objectForKey:@"Item Title"]; 

、この行が問題です。さらに、item1にオブジェクトへの有効なポインタが含まれていた場合は、オブジェクトを直接上書きして漏れただけです。あなたはself.item1 =を意味するかもしれません。

このラインの第2の問題は、WRTは/問題行動に、savedFile辞書はキー@"Item Title"のオブジェクトを持っているという保証がないことです。そうでなければ、NULLを返します。

問題#4:

item1 = nil; 

item1は、オブジェクトへの有効なポインタが含まれていた場合、あなたはそれをリークしました。あなたはself.item1 = nil;を意味するかもしれません。

+0

johne:私はこれらの問題を修正しました。これは将来覚えておくべき良いアドバイスです。 – PF1

+0

@johne item1 = nilとself.item1 = nilの違いを説明できますか? tnx私はいつも合成されたオブジェクトのために自己を使うべきですか? – Spring