2012-01-09 17 views
1

Objective-Cが新しく、アプリケーションのようにSpringboardを作成しようとしています。だから私は別のUIViewControllerからサブビューの束を生成するループを作るUIScrollViewを得た。UIScrollViewでループを持つサブビューを追加するとメモリリークが発生する

ここに私のコードです:

@implementation ProjectsListViewController { 
    ProjectViewController *icon; 
} 

-

int row = 0; 
int column = 0; 
int page = 0; 

for (int i = 0; i < 5; i++) { 

    icon = [[ProjectViewController alloc] init]; 

    icon.iconPath = @"icon.png"; 
    icon.iconTag = i; 

    int x = (1024 * page) + ((50 + (10 * column)) + (188 * column)); 
    int y = (40 + (150 * row)); 

    icon.view.frame = CGRectMake(x, y, icon.view.frame.size.width, icon.view.frame.size.height); 

    [self.scrollView addSubview:icon.view]; 

    // Add a new page if we reach the end of one 
    if ((column == 4) && (row == 3)) { 
     row = 0; 
     column = 0; 
     page++; 

     // Add a new line if we reached last column 
    } else if (column == 4) { 
     column = 0; 
     row++; 

     // Add a column otherwise 
    } else { 
     column++; 
    } 
} 

このようなもののすべては、viewDidLoadメソッドになります。私がアプリを動かすまで、すべてがうまくいくまで、アイコンはそこにあります。 しかし、アイコンをクリックしたいとき(ボタンにIBActionを押して別のビューにプッシュする)、メモリリークの可能性があるため、アプリケーションがクラッシュする可能性があります。それはもはやサブビューへの参照がないようです。

私が見つけた解決策は、各ProjectViewControllerをNSMutableArray内に追加することだけです。この方法で、私はアイコンをクリックし、別のビューを押すことができます。

私が間違っていることを誰かに説明できますか?

申し訳ありません申し訳ありませんがあなたの耳にnoobの音、私は勉強しようとしている!

注:私はARCを使用しています。

+0

IBActionはProjectViewControllerにリンクされていますか?もしそうなら、私はそれが問題だと思う。また、私が見つけたあなたの「唯一の解決策」は、今のところあなたの唯一のアイデアですか? –

+0

スタックトレースを提供する必要があります。メモリリークはクラッシュの原因ではありません(通常) – Zepplock

+0

各アイコンに 'addTarget'がありません。それはどこで設定しますか? –

答えて

0

アントワーヌがアレイで作った解決策は、私はそれを保つだろう。配列
•アイコンなしで間違っているものに洞察力を与えること

は、任意のビューにicon.viewを追加しますProjectViewController(これはその場で作成し、ARCによって解放されている)
であることが可能になります各インスタンス、(私はそれが財産(強い)であると仮定しています)アイコンのアクションがトリガされたとき、それはあなたの配列を使用して、メッセージにもはや有効

あるProjectViewControllerのインスタンスをしようとしているビュー
•語っによって保持配列に追加されたProjectViewControllerのARCによって解放されず、アイコンのアクションがトリガされると、メソッドは有効なオブジェクトに送信されますオブジェクト。

0

に関連付けられている場合は、画像の代わりにUIButtonを使用する必要があります。そうすれば、コードをモジュラーに保ち、2つの異なるオブジェクトとアクションのメモリを管理することを心配する必要はありません。

また、あなたはこの質問への最後の答えチェックアウトする必要があります:私はどうなる

icon = [[ProjectViewController alloc] init]; 

Why does static NSString leak?

0

の代わりを

ProjectViewController *projectViewController = [[ProjectViewController alloc] init]; 

あなたは新しいを作成し、この方法ループを介して毎回ProjectViewControllerのインスタンスを取得し、別の方法は毎回同じUIViewControllerを再割り当てします。

+0

ARCを使用している場合は、releaseを呼び出す必要はありません。 – madmik3

+0

おっと、私はそれを見ませんでした。申し訳ありませんが、コードを適宜更新しました。ありがとう –

1

ループ外のアイコンクラスを参照するものが何もない場合、ARCによって収集されます。それをリストに追加すると、問題が解決されます。アイコンのビューをリストに追加して、それらが参照されるようにします。アイコン自体を追跡するものはありません。

+1

iOSのガベージコレクション? –

+0

アイコンオブジェクトは、ループの最後にスコープから外れます。配列またはディクショナリ内のアイコンオブジェクトは、それらが解放されないように管理する必要があります。 – bbarnhart

+0

申し訳ありませんが、ARCはGCではありません。 – madmik3

関連する問題