2

一部の iOS デバイスで発生しているクラッシュを回避しようとしており、Apple からの「割り当てスパイクを引き起こさない」というアドバイスと併せて。このコードを一度にすべて発生しないように変更するにはどうすればよいですか?

for (Item *item in self.items) {
        ItemView *itemView = [[ItemView alloc] initWithFrame:CGRectMake(xPos, kYItemOffsetIphone, kItemWidthIphone, kItemHeightIphone) ];

        itemView.delegate = self;
        [itemView layoutWithData:item]; //this just adds an imageView and button
        [self.scrollView addSubview:itemView];
        xPos += kXItemSpacingIphone;
    }

self.items 配列には約 20 個のオブジェクトがあり、20 個の ItemView を構築するために使用されます。繰り返しますが、このコードの「割り当て集中」を軽減する方法はありますか?

4

1 に答える 1

1

私は個人的に次のようなことをしています:

  1. ビュー コントローラーdelegateをスクロール ビューにします (コードでこれを行う場合は、ビュー コントローラーの .h を変更して、 に準拠していることを示す必要がありますUIScrollViewDelegate)。

  2. scrollViewDidScroll(a) スクロール ビューの表示部分のフレームを決定するメソッドを定義します。(b) どのサブビューがその可視部分と交差するかを決定します。(c) 表示されているアイテムをロードし、表示されていないアイテムをアンロードします。

たとえば、次のようになります。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // Determine the frame of the visible portion of the scrollview.

    CGRect visibleScrollViewFrame = scrollView.bounds;
    visibleScrollViewFrame.origin = scrollView.contentOffset;

    // Now iterate through the various items, remove the ones that are not visible,
    // and show the ones that are.

    for (Item *itemObject in self.itemCollection)
    {
        // Determine the frame within the scrollview that the object does (or 
        // should) occupy.

        CGRect itemObjectFrame = [self getItemObjectFrame:itemObject];

        // see if those two frames intersect

        if (CGRectIntersectsRect(visibleScrollViewFrame, itemObjectFrame))
        {
            // If it's visible, then load it (if it's not already).
            // Personally, I have my object have a boolean property that
            // tells me whether it's loaded or not. You can do this any
            // way you want.

            if (!itemObject.loaded)
                [itemObject loadItem];
        }
        else
        {
            // If not, go ahead and unload it (if it's loaded) to conserve memory.

            if (itemObject.loaded)
                [itemObject unloadItem];
        }
    }
}

それが基本的な考え方です。アプリの特定の設計に基づいてこのロジックを最適化できますが、これは私が一般的に行う方法です。

于 2012-10-18T21:59:42.817 に答える