NSArray выпущен рано - PullRequest
       9

NSArray выпущен рано

1 голос
/ 24 августа 2011

У меня проблема с падением приложения iPhone, когда я прокручиваю UITableView вниз.Я установил NSZombieEnabled на YES и обнаружил, что NSArray, который я использую для заполнения таблицы, как-то освобождается.

#import "RootViewController.h"

@implementation RootViewController
@synthesize flashsets;

- (void)viewDidLoad
{
        //Unrelated code removed from this post
        NSString *listofsetsstring = [[NSString alloc]
                                          initWithContentsOfFile:pathtosetsdata
                                          encoding:NSUnicodeStringEncoding
                                          error:&error];
        flashsets = [listofsetsstring componentsSeparatedByString:@"\n"];
        [super viewDidLoad];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [flashsets 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:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    }

    // Configure the cell.
    NSLog(@"IndexPath.row = %i", indexPath.row);
    cell.textLabel.text = [flashsets objectAtIndex:indexPath.row]; <<<< CRASH HERE!!

    return cell;
}

@end

Я получаю message sent to deallocated instance 0x4ebae20 по жирной линии.В моем .h я использовал @property (nonatomic, retain) NSArray *flashsets;, я думал, что удерживающая часть должна удерживать его от освобождения.

Как мне удержать его от этого?

Ответы [ 4 ]

5 голосов
/ 24 августа 2011

Проблема с:

flashsets = [listofsetsstring componentsSeparatedByString:@"\n"];

изменить его на

flashsets = [[listofsetsstring componentsSeparatedByString:@"\n"] retain];

edit: свойство retain in используется только в том случае, если вы используете сеттер, поэтому оно будет работать только виспользуйте следующую строку:

[self setFlashsets:[listofsetsstring componentsSeparatedByString:@"\n"]];
1 голос
/ 24 августа 2011
 flashsets = [listofsetsstring componentsSeparatedByString:@"\n"];//it returns autorealesed NsArray.So If you want Longer Use.you should get Owner ship from that array By Alloc or Copy Or Retain.

flashsets = [[listofsetsstring componentsSeparatedByString:@"\n"] retain];
or
flashsets = [[listofsetsstring componentsSeparatedByString:@"\n"]copy];
or 
flashsets = [[NsArry alloc ] initWithArray:[listofsetsstring componentsSeparatedByString:@"\n"]];
1 голос
/ 24 августа 2011

в вашем viewDidLoad это должно быть self.flashsets = это обеспечит использование метода доступа для установки значения, и, таким образом, будет реализовано поведение 'retain', указанное вами в определении свойства.

0 голосов
/ 24 августа 2011

Я не знаю, поможет ли это, но вы можете использовать методы setter и getter при обращении к flashsets - часть сохранения свойства не применяется (я не думаю) при установке переменнойнепосредственно.

...