Помогите с iphone dev - ошибка за границей - PullRequest
2 голосов
/ 04 мая 2010

Я только изучаю разработку для iphone, поэтому, пожалуйста, прости меня за то, что, вероятно, является ошибкой новичка. Я искал вокруг и не нашел ничего конкретного для моей проблемы, так что, надеюсь, это легко исправить.

В книге приведены примеры построения таблицы из данных, жестко закодированных с помощью массива. К сожалению, он никогда не говорит вам, как получить данные с URL-адреса, поэтому мне пришлось искать это, и именно здесь мои проблемы обнаруживаются.

Когда я отлаживаю в xcode, кажется, что счет правильный, поэтому я не понимаю, почему он выходит за пределы?

Это сообщение об ошибке:

2010-05-03 12:50:42.705 Simple Table[3310:20b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (1) beyond bounds (0)'

Мой URL возвращает следующую строку:

first,second,third,fourth

А вот код iphone с рабочим примером книги, закомментированным

#import "Simple_TableViewController.h"

@implementation Simple_TableViewController
@synthesize listData;

- (void)viewDidLoad
{
    /*
     //working code from book
     NSArray *array = [[NSArray alloc] initWithObjects:@"Sleepy", @"Sneezy", @"Bashful", @"Bashful", @"Happy",
                      @"Doc", @"Grumpy", @"Thorin", @"Dorin", @"Norin", @"Ori", @"Balin", @"Dwalin", @"Fili", @"Kili", @"Oin", 
                      @"Gloin", @"Bifur", @"Bofur", @"Bombur", nil];
     self.listData = array;
     [array release];
     */

     //code from interwebz that crashes 
     NSString *urlstr = [[NSString alloc] initWithFormat:@"http://www.mysite.com/folder/iphone-test.php"];
     NSURL *url = [[NSURL alloc] initWithString:urlstr];
     NSString *ans = [NSString stringWithContentsOfURL:url];
     NSArray *listItems = [ans componentsSeparatedByString:@","];

     self.listData = listItems;

     [urlstr release];
     [url release];
     [ans release];
     [listItems release];


    [super viewDidLoad];
}

- (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;
    self.listData = nil;
    [super viewDidUnload];
}


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

#pragma mark -
#pragma mark Table View Data Source Methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.listData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier] autorelease];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    return cell;
}

@end

1 Ответ

2 голосов
/ 04 мая 2010

Вы перевыпускаете listItems так же, как и ans, это, вероятно, ваша проблема ... Когда вы не делаете выделение или сохраняете (обычно) возвращаемые объекты, они автоматически высвобождаются, поэтому вам не нужно их освобождать. [NSString ...] возвращает автоматически освобожденную строку, также как и вызов [ans componentsSeparatedByString: @ ","] ... надеюсь, что это поможет

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