2011-04-08 2 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

그게 효과가 있어요. dealloc 메소드의 끝에서 [super dealloc]을 항상 호출해야합니까? 난 슈퍼 dealloc 그냥 부모 클래스에서 인스턴스 변수를 제거 생각, 내 하위 클래스에 ivars의 보유 개수에 영향을 미칠까요? – prostock

+1

[super dealloc]은 인스턴스 변수의 보유 수를 변경하지 않습니다. 그것은 개체의 메모리를 해제 할 수 OS 알려줍니다. 그 후에 인스턴스 변수에 액세스하려고하면 더 이상 소유하지 않는 메모리를 참조하게됩니다. – cduhn

+0

... 예. 항상 [super dealloc]에게 전화하십시오. – cduhn

0

[있는 UIImage imagedNamed @ "myImage.png '']

은 자동으로 릴리즈되며, 사용자를 위해 관리되는 메모리이기도합니다. 즉시 풀어주고 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

+0

@cduhn 대답은 문제를 해결하지만 이미지를 유지할 필요가 없다면 내 방식대로 할 것입니다. – Jordan

+0

David의 thumbImage 속성을 제거 할 필요가 없습니다. UIImageView에 할당하고 표시하려고한다고 가정합니다. 그는 다른 이유 때문에 참조를 저장할 수도 있습니다. – cduhn

-1

당신은 여기에 사과의 메모리 관리 가이드를 검토 할 수 있습니다

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

특히 섹션 진술 : 당신이 방법을 사용하여 만드는 경우

당신은 개체의 소유권을 이름이 "alloc", "new", "copy"또는 "mutableCopy"(예 : alloc, newObject 또는 mutableCopy)로 시작하거나 retain 메시지를 보내는 경우.

이러한 기능 중 하나를 사용하지 않으므로 개체 소유권이 없으므로이를 해제 할 수 없습니다.

+0

맞습니다. 이미지를 보유 속성에 지정하고 있습니다.> 그것이 공개되어야합니다. – SVD

0

먼저 물건을내어 놓은 다음 [super dealloc]으로 전화해야합니다. [super dealloc]은 메모리 클래스를 해제하고 나중에 ivar에 액세스하면 segfault가됩니다.

관련 문제