2011-02-10 8 views
0

保持/解放について以下のステートメントに問題がありますか。保持/解放の問題

xyzProp = [NSMutableString stringWithString:@"Report error"]; 

私は上記のステートメントのために、私はあると思うのエラーを取得しています

xyzPropは財産であり、私はのdeallocでのリリースを使用しています。

+0

状況を正確に追加してください。 – David

答えて

2

割り当てられていないため、このオブジェクトを解放しないでください。

"stringWithString"メソッドは、自動解放されたオブジェクトを返すので、自動解放するか、または解放してから解放する必要があります。

  • 新しい
  • 他の方法が返されますコピーを保持

    • のalloc:

      一般的なルールとして、あなたはあなたが使用して作成したオブジェクトを解放する必要があります自動リリースされたオブジェクト。

      EDIT:

      xyzPropだけのメンバ変数ではなく、プロパティです。プロパティを(retain)として宣言すると、生成されたセッターメソッドは新しい値を保持します。メンバー変数を直接設定する場合は、割り当てなかったものも保持する必要があります。

    +0

    実際、私は(非原子的な、保持する)プロポーザルとしてそれを定義しています。だから、正しいアプローチは何ですか? – testndtv

    +0

    私はあなたがインスタンス変数の内容をオートリリースするようにすべきではないと確信しています。 – Chuck

    +0

    xyzPropはプロパティではありません。バッキング変数なので、保持する必要があります。 –

    0

    xypPropそれ自身では、ではありません。プロパティ - プロパティをバッキングするインスタンス変数でなければなりません。そしてその場合、はい、それは誤りです。自分が所有していないものをインスタンス変数に代入しているので、おそらくあなたの下から消えてしまいます。解放するのは間違いです。なぜなら問題はあなたが最初にそれを所有していないからです。プロパティーセッター(これは正しい)を使用するには、self.xyzProp = [NSMutableString stringWithString:@"Report error"];でなければなりません。

    1

    stringWithStringを返します。オートレリース文字列を返します。

    xyzPropはプロパティですが、xyzPropの設定はxyzPropの設定を行わずに直接割り当てられます。xyzPropはその文字列のretainCountを増加させません。つまり、将来、この文字列が解放され、オブジェクトのdeallocが呼び出される前に発生する可能性があります。

    文字列を保持プロパティとして宣言します。

    @property (nonatomic, retain) NSMutableString *xyzProp; 
    

    と設定する場合は、セッターを使用してください。

    self.xyzProp = [NSMutableString stringWithString:@"Report error"]; 
    

    リンゴ生成セッターは多少このようになり、self.xyzProp = ...を呼び出す

    - (void)setXyzProp:(NSMutableString *)aString { 
        if (aString == xyzProp) { 
         return; 
        } 
        NSMutableString *oldValue = xyzProp; 
        xyzProp = [aString retain]; 
        [oldValue release]; 
    } 
    

    は呼び出しと同じです、[self setXyzProp:...]セッターは、その後、渡された文字列に保持呼んれると呼ばれることを保証します。

    更新

    文字列を設定する場合NSMutableStringが渡されているので、あなたは、ほとんどの場合、特にこの場合には、copy代わりのretainにしたいです。その理由は、文字列の値が、オブジェクトが予期しない動作につながる可能性があることを知らずに、オブジェクトの外側から変更される可能性があるからです。

    0

    stringWithString:がオートレリースされたオブジェクトを返していて、ここで割り当て(プロパティではない)を使用しているときは、deallocメソッドで解放しようとするとエラーになりますクラス)。

    あなたxyzPropは本当に、次のように、あなたがプロパティにsetterメソッドを使用することができ、その宣言に属性を保持して、プロパティの場合:

    self.xyzProp = [NSMutableString stringWithString:@"Report error"]; 
    

    をあなたがする何を意味するのか、多分はどれ。あなたがまだ混乱している場合は、アップルのプロパティプログラミングガイドを参照することをお勧めします。

    +0

    私はxyzPropを自己に置き換えたばかりです。 xyzPropしかし、まだアプリケーションがクラッシュしているようだ(悪い信号...) 私は今、self.xyzProp = [NSMutableString stringWithString:@ "Report error"];を使用しています。 – testndtv

    関連する問題