2011-12-14 8 views
2

私は奇妙な問題があります。 pictureLinkは私が奇妙な結果を持って、このコードNSString変数の値を取得

NSString * myPictureUrl=[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; 
pictureLink=myPictureUrl; 

を書いて、それは私が持っているポインタ それとも

pictureLink=[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; 

でなければなりません.H

NSString *pictureLink; 
} 
@property(retain,nonatomic) NSString *pictureLink; 

で宣言されたグローバル変数でありますEXC_BAD_ACESSエラー

+0

可能であれば、ARCを使用すると、コンパイラはバックグラウンドのすべての保持カウントを処理します。 – zaph

答えて

6

メモリ管理のエラー、yあなたのコードにmyPictureUrlを保持していません。

[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash];は自動解放値を返しますので、あなたは、2つのオプションがあります。

  1. pictureLink=myPictureUrl;[self setPictureLink:myPictureUrl];のようになりますが。
  2. [myPictureUrl retain];を実行し、後でreleaseを忘れないでください。

プロジェクトではARC(Automatic Retain Counting)を使用することを検討してください。 ARCでは、コンパイラは保持カウントを処理するので、実際には許されません。現在のプロジェクトを変換するリファクタリングがあります。

+1

周囲にコードを記述しないプロパティがある場合は、setters/gettersプロパティを使用します。 'pictureLink'に直接割り当てると、' pictureLink'が現在指しているオブジェクトのメモリリークが発生します。 – zaph

+0

@Andrey完璧に働いていただきありがとうございます。それは私の最初のアプリだと私はオブジェクトをリリースしない:Dそれは私に問題を引き起こすでしょうか? – user567

+0

@Mehdi:確かに、 ' - (void)dealloc'メソッドですべての' retain'/'strong'プロパティーを解放する必要があります。 –

2

変数を直接呼び出すことで@propertyを迂回しているため、@propertyの設定で提供されたmagicは保持されず、解放されません。
@propertyを使用するには、self.pictureLinkを実行する必要があります。
は実際にそれをやってみたかった、私は本当に@property私は周りに行く場合、私は

NSString *theProperty 
} 
@property (nonatomic, retain) NSString *property; 

@synthesise property = theProperty; 

その方法を次の操作を行い、直接私の変数にアクセスする誘惑を避けるために。
しかし、そうするには、非常に、非常に、非常に良い理由が必要です。それから、十分な理由がないかもしれません。

+1

@VinceBumまた、ivarに直接割り当てることによって、それが指し示す以前のオブジェクトに対してリリースは行われません。 – zaph

+0

@CocoaFu、 '@ property'をバイパスするのは悪いです。 –

+0

もっと一般的に、 "the"の代わりにアンダースコア "_"が使用されています。例: '@synthesise property = _property;'しかし、 'theProperty'は正常に動作します。 – zaph