0

運が悪かったので、OpenFlowインスタンスの画像を必死に変更しようとしています。私はあきらめているので、インスタンスを削除して新しいインスタンスを作成しようとしています。しかし、私はアプリのクラッシュを避けられません。

それを作成するためのコードは次のとおりです。

AFOpenFlowView *of = [[AFOpenFlowView alloc] initWithFrame:CGRectMake(0, 100, 320, 380)];
 [of setCenter:CGPointMake(160, 240)];
 [of setBackgroundColor:[UIColor blackColor]]; 
 [of setDataSource:self];
 [of setViewDelegate:self];

 [self setPeopleFlow:of];      
 [self.view addSubview:peopleFlow];

 [of release];

次に、ボタンをクリックすると、次のようになります。

[peopleFlow removeFromSuperview];
[peopleFlow release];

後で、コードの最初のブロックで同じ関数を呼び出して再度作成します。これは、アプリケーションがログエラーなしでクラッシュしたときです。

OpenFlowオブジェクトをクリーンアップして、削除/再作成せずに再作成する方法についてのアイデアはありますか?または、どのように確実に作成/再作成しますか?

4

1 に答える 1

0

peopleFlowインスタンスを作成すると、保持カウントは1になります。

次に、それをサブビューとして追加すると、スーパービューがそれを保持するため、保持カウントは2になります。

次に、スーパービューに追加した後で解放すると、保持カウントは再び1になります。

次に、それをスーパービューから削除すると、スーパービューがそれを解放するため、保持カウントは0になり、オブジェクトの割り当てが解除されます。

次に、もう一度リリースしようとするとrelease、割り当てが解除されたオブジェクトに送信しているため、クラッシュします。

簡単に言うと、この場合、スーパービューから削除した後で解放する必要はありません。

また、ポインタを離して何を指しているのか気にしない場合は、ポインタにnilを割り当てることをお勧めします。これは、オブジェクトを解放して割り当てを解除した後も、ポインタ変数がオブジェクトが占有していたメモリを指しているためです。ポインタにnilを割り当てると、ダングリングポインタが指しているものにメッセージを送信しようとした場合に、問題が発生するのを防ぐことができます。

于 2010-07-16T13:23:18.773 に答える