-1

少し混乱しています。配列をtableViewdataSourceメソッドnumberOfRowsInSectionに出力すると、アプリがクラッシュします。

これは私のコードです:.hファイル内

@interface AddColor : UIViewController<UITableViewDataSource,UITableViewDelegate>
{
UITableView *tblView;
NSArray *arrayColors;
}
@property(nonatomic,retain)NSArray *arrayColors;

@end

.mファイル内

@synthesize arrayColors;
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.navigationController setNavigationBarHidden:NO];

     arrayColors = [NSArray arrayWithObjects:@"blackColor", @"darkGrayColor", @"lightGrayColor", @"whiteColor",  @"grayColor", @"redColor", @"greenColor", @"blueColor", @"cyanColor", @"yellowColor", @"magentaColor", @"orangeColor", @"purpleColor", @"brownColor", nil];


    tblView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];
    tblView.delegate=self;
    tblView.dataSource=self;
    [self.view addSubview:tblView];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

   NSLog(@"%d",[arrayColors count]);//App crashes here.
   return [arrayColors count];
}

[arrayColors count]を印刷すると、アプリがクラッシュします。

クラッシュの解決策を見つけました。配列をviewDidLoadに保持するだけです。

[arrayColor retain];

そして今はうまく働いています。しかし、[arrayColor count]を印刷する前に、アプリがクラッシュするのはなぜですか。

4

4 に答える 4

2
  1. [self.arrayColors count] を使用してみてください - ivar ゲッターとセッターを使用して、保持されたプロパティにアクセスします

  2. 余談ですが、テーブルビューのサイズをハードコーディングしないことを強くお勧めします。少なくとも、自動サイズ変更マスクを設定してください。

于 2012-09-08T13:31:39.447 に答える
1
+ [NSArray arrayWithObjects:]

自動解放された配列を作成します-解放されたときに分離されませんが、メソッドが戻ったときに解放される可能性が高いviewDidLoadため、でアクセスする無効な(ガベージ)ポインターです[arrayColor count]

配列を保持することで、割り当て解除エラーを取り除くことができますが、メモリリークが発生しています。これを正しい方法で解決する一般的なアプローチは、次のような初期化メソッドの1つで配列を割り当てて初期化することです。

- (id)init
{
    if ((self = [super init])) {
        arrayColors = [[NSArray alloc] initWithObjects:..., nil];
    }
    return self;

}

- dealloc次に、メモリをリークしないようにパージします。

- (void)dealloc
{
    [arrayColors release];
    [super dealloc];

}

AppleDeveloperに関するトピックの詳細

于 2012-09-08T13:08:52.330 に答える
0

ファイル所有者ではなく、DataSource と Delegate を TableView にリンクした可能性があります。

于 2012-09-08T13:10:55.133 に答える
0

これを行うと、

 [self setArrayColors:[NSArray arrayWithObjects:@"blackColor", @"darkGrayColor", @"lightGrayColor", @"whiteColor",  @"grayColor", @"redColor", @"greenColor", @"blueColor", @"cyanColor", @"yellowColor", @"magentaColor", @"orangeColor", @"purpleColor", @"brownColor", nil]];

別の保持を必要とせずに問題を修正する必要がありますが、dealloc で必ず解放してください。

  [arrayColors release];
于 2012-09-08T14:20:35.967 に答える