UITAbleView Ошибка выдачи - PullRequest
       5

UITAbleView Ошибка выдачи

0 голосов
/ 13 октября 2009
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 //NSLog(@"Array: %@",rows);
    return [rows count];// AT THIS LINE
}

Программа получила сигнал: «EXC_BAD_ACCESS»

СПАСИБО ЗА ОТВЕТ На самом деле я прикрепил его к WebPage By NSUrl, где я создал массив PHP, и я создал NSLOG, где я получаю значения в форме массива, но когда он выходит за пределы строки, return [[count count]; Выдает ошибку, когда я пишу статически return 2;, а затем выполняется. Я объясняю вам, что я делаю. Я инициализирую NIb с

Name tableViewController=[[JsonTestViewController alloc] initWithNibName:@"JsonTestViewController" bundle:nil];

В JsonTestViewController.m У меня есть этот код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    //NSLog(@"Array: %@",rows);
    return [rows count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   
    }

    // Configure the cell.
    NSDictionary *dict = [rows objectAtIndex: indexPath.row];
    NSString *strlb1=[dict objectForKey:@"block"];
    NSString *strlb2=[dict objectForKey:@"name"];
    strlb1=[strlb1 stringByAppendingString:@" , "];
    strlb1=[strlb1 stringByAppendingString:strlb2];
    NSString *str1=@"FPS : ";
    NSString *str2=[dict objectForKey:@"p_hours"];  
    NSString *strpinf;
    if([str2 isEqualToString:@"FP"])
    {
        strpinf=@"Free Parking";
    }
    else if([str2 isEqualToString:@"12"]) 
    {
        strpinf=@"2 hours";
    }
    else if([str2 isEqualToString:@"14"]) 
    {
        strpinf=@"4 hours";
    }
    else if([str2 isEqualToString:@"MP"]) 
    {
        strpinf=@"Metered Parking";
    }
    str1=[str1 stringByAppendingString:strpinf];
    cell.textLabel.text =strlb1;
    cell.detailTextLabel.text = str1;



    return cell;
}
- (void)viewDidLoad {

    [super viewDidLoad];
    NSURL *url = [NSURL URLWithString:@"SITE URL"];
    NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url];

    NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding];
    NSError *error = nil;


    NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
    if (dict)
    {
        rows = [dict objectForKey:@"users"];
    }

    NSLog(@"Array: %@",rows);
    [jsonreturn release];
}



- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

@end

1 Ответ

0 голосов
/ 13 октября 2009

Можете ли вы дать больше информации? Это может быть что угодно, но, скорее всего, строки указывают на память, где был действительный массив. Как вы создали массив строк?

Например, ваш массив строк или словарь больше не указывают на допустимую память, если вы создали массив строк как объект автоматического освобождения с помощью фабричного метода в другом методе.

Вот еще один вопрос, довольно близкий к тому, что вы описываете:

Принят сигнал EXC_BAD_ACCESS

EDIT:

Итак, глядя на предоставленный вами код, у этих строк есть несколько возможностей:

NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
    if (dict) { rows = [dict objectForKey:@"users"]; }

метод deserializeAsDictionary может возвращать либо автоматически выпущенный словарь, либо NULL. так что одна возможность состоит в том, что строки = NULL. при попытке [количество строк] ваша программа потерпит крах. Проверьте и посмотрите, что в ошибке, может дать вам некоторые подсказки.

Это приведет к ошибке, даже если вы явно вернете 2 для numberOfRowsInSection:, потому что в cellForRowAtIndexPath: вы все еще пытаетесь получить доступ к строкам, даже если это может быть NULL.

другая возможность заключается в том, как вы определили строки. Я предполагаю, что это свойство в вашем классе. Но там, где у вас есть rows=[dict objectForKey:@"users"];, строки могут ничего не указывать после завершения метода. У строк по-прежнему будет адрес, где был [dict objectForKey:], но после области действия метода, dict может исчезнуть и все данные, которые идут с ним.

NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];

в соответствии с рекомендациями KVC, вы должны ожидать, что dict автоматически высвобождается после окончания метода.

и еще одна возможность, поскольку я не знаю специфики используемого вами класса JSON, заключается в том, что когда вы выпускаете jsonreturn, вы также освобождаете все связанные с ним данные. Таким образом, строки не указывают ни на что.

В данном случае ошибка, похоже, коренится в том, как вы устанавливаете / сохраняете / обращаетесь к строкам.

попробуйте использовать Build-> Build & Analyze в xcode. это может дать вам еще несколько советов. или бросить в кучу NSLog(@"%d",[rows count]); все кончено. также попробуйте использовать отладчик. он даст вам трассировку вызовов методов, которые приведут к сбоям [количества строк].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...