2011-11-19 13 views
0

オブジェクト、私は次のようにオブジェクトの配列を管理することができ:XCodeの4コンパイラでXCodeの4 CアレイはXCodeの3コンパイラで

@interface myView:UIView 
{ 
    CALayer *layer[4]; 
} 

@property (nonatomic,retain) CALayer **layer; 
@end 

@implementation myView 
@dynamic layer; 

- (CALayer **)layer { return layer; } 

// I could then access elements like 

- (void) example 
{ 
    self.layer[3] = NULL; 
} 

@end 

@property宣言エラー「保持持つプロパティでなければなりませんを生成しますオブジェクトタイプ "と呼ばれます。

NSArrayに変換するのが最善の方法だと思いますが、Cスタイルの配列添え字(たとえば、self.layer [i])を使用して100行のコードを使用しています。修正する他の方法がありますか?

+0

これは、デフォルトのコンパイラをLLVMからLLVM gcc 4.2に変更することです。しかし、LLVMを使ってこれを行う方法があるのはまだ分かりますか? – user1055568

+1

配列を変更したときに保持/解放することを忘れることによって引き起こされるメモリリークやランダムクラッシュの追跡は、自動参照カウントを使用できなくなってしまう余分なものをすべて回避することになります。これを固定する。 –

答えて

1

assignプロパティに変更して、非オブジェクトを保持しないようにしますか?

+0

はい、それは私がやっていることです。私は、たとえコンパイラが不平を言っていなくても、gccでretainプロパティが動作していなかったので、私は手動でretain/releaseをやっています。 – user1055568

0

C配列でObjective-Cメモリ管理呼び出し(つまり、保持)を使用することはできません。標準のCまたはC++ロジックを使用してアレイを管理する必要があります。自分でmallocとメモリを解放する必要があります。配列を保持する必要がない場合は、retainプロパティを削除できます。このコードで

+1

宣言したように、ivar自体にはメモリ管理は必要ありませんが、ivarに含まれるオブジェクトには必要ありません。 ivarのメモリはオブジェクト内にインラインで格納されます。 'malloc'や' free'は必要ありません。 – bbum

2

いくつかの問題:

  • それはMyView、ないmyViewする必要があります。クラスは大文字で始まります。

  • CALayer **は、ではなく、オブジェクトタイプです。これはオブジェクト型へのポインタなので、コンパイラは苦情を申し立てます。単に割り当てを行うだけでコンパイルできますが、それでも問題はあります。

  • このデータを保持する言語配列(MyClass foo[4])を使用する理由はありません。あなたがスタンドイン「このスロットが読み込まれていません」のよう[NSNull null]を使用することができます(NSMutableArrayのを使用してください。

をあなたが本当には、言語配列に固執したい場合は、retainをドロップします。ちょうどあなたことを覚えておいてください配列内のオブジェクトの保持/解放を明示的に管理する必要があります。

また、標準的な標準パターンでインラインになるようにコードを修正するのは苦労するかもしれませんが、コードが進化するにつれて、よりコストがかかるようになり、いつか、本当にそうする必要がある状況になるでしょう。

+0

私はgccの元のコードがなぜ/どのように動作するかを知りたいと思います。 – hooleyhoop

+0

コードはGCCでは機能しませんでした。 GCCはエラーをキャッチするにはあまりにも愚かでした。 GCC 4.2での '@ property'の動作も悪夢であり、多くの工学的努力をしなければ捕らえられなかったいくつかのエラーケースがありました。 – bbum

+0

ああ、それはなぜ私が動作していなかったので、私は保持/リリースのような不愉快な動作を見つけた!私は、私が同じことをしていることがわかったコードからは不適切に推測したと思いますが、retainプロパティはありません。それでも、私は原則として、私がしたいことをする方法がないのはなぜか分かりません。明らかに、私は別個のオブジェクト* layer0、* layer1、* layer2、* layer3を宣言して、それが私が望むように動作するようにすることができました。ですから、レイヤー[0]、*レイヤー[1]、*レイヤー[2]、*レイヤー[3]はどうですか?実際には、それは正常に動作すると思う、ちょうど、私が理解するように、大丈夫です保持/リリースを合成しません。 – user1055568

関連する問題