2011-04-08 69 views
0

为什么当我尝试释放用+ imageNamed创建的图像时,应用程序崩溃:dealloc内部。我的代码如下:当使用+ imageNamed创建的uiimage在dealloc中释放时,应用程序崩溃

MyClass.h:

#import <UIKit/UIKit.h> 
@interface MyClass{ 
    UIImage *_thumbImage; 
} 
@property (nonatomic,retain) UIImage *thumbImage; 
@end 

MyClass.m:

#import "MyClass.h" 
@implementation MyClass 
@synthesize thumbImage = _thumbImage; 
-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    self.thumbImage = [UIImage imagedNamed:@"myImage.png""]; 
} 
-(void)viewDidUnload{ 
    self.thumbImage = nil; 
} 
-(void)dealloc{ 
    [super dealloc]; 
    [_thumbImage release]; //if i leave this here, the app crashes. should i release my property? 
} 


@end 

回答

3

在你的dealloc方法中,你需要将[super dealloc]移动到底部。你正在试图在你的对象的实例变量被处理后访问它。

+1

thx它的工作。所以应该在dealloc方法的结尾总是调用[super dealloc]?我认为超级dealloc只是删除父类中的实例变量,为什么它会影响我的子类中的Ivars的保留数? – prostock 2011-04-08 17:25:20

+1

[super dealloc]不会更改实例变量的保留计数。它告诉操作系统你的对象的内存可以被释放。所以,当你尝试访问实例变量后,你引用了你不再拥有的内存。 – cduhn 2011-04-08 17:36:19

+0

...所以是的。总是最后调用[super dealloc]。 – cduhn 2011-04-08 17:37:03

0

[UIImage的imagedNamed:@ “myImage.png”“];

是自动发布的,它也是为你管理的内存,如果你需要立即释放它,那么alloc/init一个UIImage或创建UIIm ageView。

#import <UIKit/UIKit.h> 
@interface MyClass{ 
} 
@end 


#import "MyClass.h" 
@implementation MyClass 
-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRect(0,0,100,200)]; 
    imageView.image = [UIImage imagedNamed:@"myImage.png""]; 
    [self.view addSubView:imageView]; 
    [imageView release]; 
} 
-(void)viewDidUnload{ 
} 
-(void)dealloc{ 
    [super dealloc]; 
} 
+0

二传手会自动保留它。 – JustSid 2011-04-08 17:19:03

+0

@cduhn答案解决了这个问题,但如果你不需要保留图像,那么我会按照自己的方式去做。 – Jordan 2011-04-08 17:29:47

+0

删除David的thumbImage属性不是必需的。你假设他想把它分配给UIImageView并显示它。他可能想为其他原因保存对它的引用。 – cduhn 2011-04-08 17:31:28

-1

您可能想要查看苹果的内存管理指南这里:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

特别是部分指出:

,如果你使用的方法创建你需要一个对象的所有权其名称以“alloc”,“new”,“copy”或“mutableCopy”(例如alloc,newObject或mutableCopy)开头,或者如果您向其发送保留消息。

由于您没有使用这些功能之一,因此您没有该对象的所有权,因此无法释放它。

+0

这是正确的,但他将图像分配给一个保留属性=>它应该被释放。 – SVD 2011-04-08 17:13:07

0

你需要首先发布你的东西,然后致电[super dealloc][super dealloc]将释放类的内存并在之后访问ivar会导致段错误。

相关问题