NSArray早早发布

时间:2011-08-24 03:32:02

标签: iphone memory-management nsarray

当我向下滚动UITableView时,我的iPhone应用程序崩溃了。我将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。在我使用@property (nonatomic, retain) NSArray *flashsets;的时候,我认为保留部分应该避免解除分配。

如何防止这样做?

4 个答案:

答案 0 :(得分:5)

问题在于:

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

将其更改为

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

编辑:只有在使用setter时才使用retain in属性,因此只有在使用以下行时才能使用:

[self setFlashsets:[listofsetsstring componentsSeparatedByString:@"\n"]];

答案 1 :(得分:1)

在viewDidLoad中它应该是self.flashsets =这将确保访问器方法用于设置值,因此将实现您在属性定义上指定的“保留”行为。

答案 2 :(得分:1)

 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"]];

答案 3 :(得分:0)

我不知道这是否有帮助,但你可能想在引用flashset时使用setter和getter方法 - 设置变量时属性的保留部分不适用(我不认为)直接