我知道在很多情况下我不必释放静态变量。但是以下是我的模型的代码:
+ (UIImage*)imageForTag
{
static UIImage *imgTag;
if(imgTag == nil)
{
NSString* imageName = [[NSBundle mainBundle]
pathForResource:@"tag" ofType:@"png"];
imgTag = [[[UIImage alloc]
initWithContentsOfFile:imageName] autorelease];
}
return imgTag;
}
这是我的数据表部分
- (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];
}
if (indexPath.row == 0)
{
cell.imageView.image = [DataModel imageForSmtng];
}
else if(indexPath.row == 1)
{
cell.imageView.image = [DataModel imageForTag];
}
return cell;
由于cell.imageView.image = [DataModel imageForTag]
指向无效地址,第二次imageForTag
会崩溃。如果我添加保留,它不会崩溃。从上面删除自动释放并忘记imgTag
引用是错误的吗?
答案 0 :(得分:1)
这是错的。因为当您在imgTag变量上调用autorelease时,您只需释放它指向的对象。但是,imgTag变量仍指向该范围的内存。所以,当你再次调用imgTag时,它不是零,它仍指向某个东西,这是无效的东西。
所以,解决方案应该是:
1 /你不应该发布它
2 /当您认为现在是发布它的好时机时,您必须手动释放它。然后记得要做:imgTag = nil