2011-07-20 17 views
1

exampleObjectというオブジェクトが2つの文字列プロパティ(moduleNameおよびpool)を持っています。文字列内のObjective-Cスペース

@property (nonatomic, assign) NSString *moduleName; 
@property (nonatomic, assign) NSString *pool; 

これらの両方IBActionがトリガされたときに、それぞれmoduleNameFieldとという名前の2つのテキストフィールドを使用して設定されています

if (![[moduleNameField text] isEqualToString:@""]) { 
    [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] setModulename:[moduleNameField text]]; 
} 
if (![[poolField text] isEqualToString:@""]) { 
    [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] setPool:[poolField text]]; 
} 

のNSLog文で自分の価値を確認した後:

NSLog(@"The moduleName is:%@", [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] moduleName]); 
NSLog(@"The pool is:%@", [[[appDelegate moduleList] objectAtIndex:[appDelegate moduleNum]] pool]); 

私は正しい出力を得ます:

The moduleName is:Module Name One 
The pool is:Pool One 

ここで奇妙なところがあります。しかし

The Name is:Module Name One 

:私はそれを印刷し最初のログ文を取得することができるよ

NSString *theModName = [NSString stringWithFormat:@"%@\n", [self moduleName]]; 
NSLog(@"The Name is:%@",theModName); 

NSString *thePool = [NSString stringWithFormat:@"%@\n", [self pool]]; 
NSLog(@"The Pool is:%@",thePool); 

を:exampleObjectの関数を呼び出す際に、私が使用してpoolmoduleNameプロパティを取得しよう、エラーメッセージなしで次の行にアプリケーションがクラッシュします。さらに興味深いのは、thePoolがスペースまたは大文字と小文字が混在した文字列の場合にのみクラッシュすることです。 「Pool One」ではなく、「Poolone」にしてしまえば、クラッシュすることはありません。

これについての洞察は非常に高く評価されます。

答えて

2

メモリの問題のように聞こえ、NSString*のプロパティが割り当てられるように設定されています。 copyまたは少なくともretainに設定し、deallocメソッドで確実にリリースすることをお勧めします。メッセージを割り当てるように設定されているので、いつでもクラッシュが発生する可能性があります。この場合はpoolになります。

+0

それを固定聖なる地獄は、 。私はプロパティを宣言するときに、より慎重になるでしょう!ありがとう:)それは私にできるだけ早くあなたの答えを受け入れるよ – hemlocker

1

Cocoa memory management rulesに続いて、-textなどのメソッドは、所有していないインスタンスを返します。

あなたが周りにそれらを維持したい場合は、代わりにassignの(変更可能な文字列が渡されたときにも問題を回避するため)できれcopyプロパティを使用して、所有権を取得する必要があります。

@property (nonatomic, copy) NSString *moduleName; 
関連する問題