2016-03-24 5 views
0

の原因となるので、物語はこのように書きます:)アレイブロックの列挙にUITableViewsの作成はクラッシュ

私はNSArrayの中で列挙オブジェクトをブロックし、動的にそれらのそれぞれについてUITableViewsを作成し、UIScrollViewの中でそれらを追加しようとしています。私は可読性と再利用のためにLighter View Controllers from www.objc.ioを使用しています。 dataSourceはUITableViewごとに個別に作成されます。問題は、私はスピードの懸念のために、弱い保持されているブロックの列挙内のオブジェクトとデータソースが実際に各テーブルの割り当てを解除されることを確認することができ、スタック上のポストから出た

-[NSObject(NSObject) doesNotRecognizeSelector:] 

ですべての時間をクラッシュです。

私は__strongでArrayDataSourceを初期化しようとしましたが効果はありませんでした。

__strong ArrayDataSource *customdayTableDataSource = [[ArrayDataSource alloc] initWithConfigureCellBlock:configureCell cellIdentifier:DayTableCellIdentifier]; 

ブロックで何が間違っていますか?私に正しい方向を教えてもらえますか?

TableViewCellConfigureBlock configureCell = ^(id cell, id object) { 
    [cell configureForObject:object]; 
}; 

[NSArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    int tableHorizontalPosition = [[UIScreen mainScreen] bounds].size.width * idx;    
    int tableHeight = [[UIScreen mainScreen] bounds].size.height; 

    UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(tableHorizontalPosition, 0, [[UIScreen mainScreen] bounds].size.width, tableHeight) style:UITableViewStylePlain]; 

    [table setDelegate:self]; 

    ArrayDataSource *customDataSource = [[ArrayDataSource alloc] initWithConfigureCellBlock:configureCell cellIdentifier:MyCellIdentifier]; 

    [customTableDataSource setOriginalData:[NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]]; 

    [table setDataSource:customTableDataSource]; 

    [[self myUIScrollView] addSubview:table]; 

}]; 

rmaddyで指摘したようにiがブロックの範囲外初期化にNSArrayに各データソースを追加しました。これは私の問題を解決しました。人々はコメントで言ったように、彼らは限りtableviews、または多分より容易なソリューションとして、あなたのクラスではobjc_setAssociatedObject

使用して強い参照を作成することです「生きている」となりますどこに

+1

ブロック列挙体のオブジェクトが弱いという問題ではありません。テーブルビューの 'dataSource'プロパティは弱く、' ArrayDataSource'インスタンスはブロックの終わりを超えて生きていません。 – rmaddy

+0

しかし、私は__strongで助けを借りてそれを初期化しようとしました。私はテーブルにそれをassaignするときに保持カウントが1つ上がるべきではない? – ha100

+0

'__strong'を追加しても何もしません。既にデフォルトです。それを参照するためには、より長い範囲のものが必要です。テーブルにはデータソースの弱い参照が格納されているため、割り当て時に保持カウントは上がらない可能性があります。 – dan

答えて

0

、あなたがどこかdatasorcesを作成する必要があります感謝、データソースを設定した後、いくつかのstatic char strongReferenceKey

とあなたのブロック内を宣言した:ところでテーブルはWHがリリースされるデータソース、上の強い参照を持っています

objc_setAssociatedObject(table, &strongReferenceKey, customDataSource, OBJC_ASSOCIATION_RETAIN); 

テーブルが解放されます。

P.S. runtime.hをインポートすることを確認してください:

#import <objc/runtime.h> 
関連する問題