出於某種原因,下面代碼中的保留/釋放行爲讓我完全困惑。UIImage imageNamed沒有正確地自動解除
selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage release];
這應該突破,但不。爲什麼?我認爲imageNamed
autoreleased本身,這意味着這裏釋放是多餘的,應該在autorelease發生時中斷。
這裏是從h和.m文件有關selectedImage片段:
@property (nonatomic, readonly) UIImage *selectedImage;
@synthesize delegate, selectedImage, spacerBottom, currentIndex;
其他注意事項,這確實突破:
selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage release];
[selectedImage release];
//objc[55541]: FREED(id): message release sent to freed object=0x59245b0
//Program received signal: 「EXC_BAD_INSTRUCTION」.
由於確實這樣的:
selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage release];
[selectedImage autorelease];
//objc[55403]: FREED(id): message autorelease sent to freed object=0x59b54c0
//Program received signal: 「EXC_BAD_INSTRUCTION」.
A ND所以做如下:
selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage autorelease];
[selectedImage release];
//objc[55264]: FREED(id): message release sent to freed object=0x592c9a0
//Program received signal: 「EXC_BAD_INSTRUCTION」.
所以確實這樣的:
selectedImage = [UIImage imageNamed:@"icon_72.png"];
[selectedImage autorelease];
[selectedImage autorelease];
//objc[55635]: FREED(id): message release sent to freed object=0x5b305d0
//Program received signal: 「EXC_BAD_INSTRUCTION」.
像海報說的,你實際上是過度放出selectedImage,每當你調用一個類方法,它就會返回一個自動釋放的對象 – Daniel 2010-05-28 15:19:59