-1

以下のコードはXcode3.2で使用し、非常にうまく機能しました

@interface MoObject : UIViewController 
{

    NSMutableArray *categoryArray;     
}



@property (nonatomic, retain) NSMutableArray *categoryArray;

@end;



@implementation MyObject

@synthesize categoryArray;


- (void)viewDidLoad
{
     [super viewDidLoad];


    NSMutableArray *a = [[NSMutableArray alloc] init];

    categoryArray = a;
  [a  release]; //AAA:I can not release this, it does not report compiling error , but after some operation, it will cause exec bad error

}
- (void)dealloc {

    [category release];

    [super dealloc];
}

Xcode 4.3.1iOS5.1に移行します

同じ関数が非常に多くのexecbadエラーを引き起こします。

プロジェクト全体のARCを閉じても。

問題はまだ存在します。ポイントAAAでオブジェクト配列を解放できないようです。

コメントを歓迎します

4

2 に答える 2

2

ARCのポイントは、保持/解放コードを処理することです。配列「a」はローカルで宣言されているため、その関数が終了すると、ARCはコードを挿入して解放します。Deallocについても同じです。ARCでは必要ありません(実際には使用できません)。

ただし、ARCが気に入らない、または習得したくない場合は、ARCを使用する必要はありません。これは、新しいプロジェクトを作成するときのオプションです。

于 2012-04-24T06:56:18.540 に答える
2

ARCを使用していません。もしそうなら、使用するコード-releaseはコンパイルすらしません。[super dealloc]どちらもあなたの-deallocメソッドを呼び出さないでしょう。

あなたが持っているのはただの普通のメモリ管理のバグです。aインスタンス変数に直接割り当てていますcategoryArray。プロパティ用に合成されたセッターを使用しておらず、適切なメモリ管理を行うのはセッターです。そのため、categoryArray割り当てが解除されたオブジェクトを指すことになります。self.categoryArray = a同等のステートメントであるまたはのいずれかを使用する[self setCategoryArray:a]と、バグはなくなります。

ARCでは、このバグはほとんど隠されています。インスタンス変数はcategoryArrayデフォルトで__strongであるため、配列は少なくともそれを指している限り保持され、エラーは発生categoryArrayしませんEXC_BAD_ACCESS。ただし、初期化メソッド内を除いて、セッターをバイパスして直接割り当てるのはまだバグがあります。

于 2012-04-24T07:24:00.493 に答える