当我向下滚动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;
的时候,我认为保留部分应该避免解除分配。
如何防止这样做?
答案 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方法 - 设置变量时属性的保留部分不适用(我不认为)直接