문제

여기에 일반적인 실습 나는 자주(등에서 매우 인기있는 개발자 아이폰 book)

니다.서 파일

@interface SomeViewController : UIViewController
{
  UIImageView *imgView;
}

에서 어딘가에.m file:

imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]
applicationFrame]];
[imgView setImage:[UIImage imageNamed:@"someimage.png"]];
[self addSubview:imgView];
[imgView release];

그리고 나중에,우리는 이...

- (void) dealloc
{
  [imgView release];
  [super dealloc];

} 

이후 imgView 가 일치하는 alloc 및 출시 릴리스의 imgView 에 dealloc 필요한가?

어디에 imgView 에 의해 유지 addSubview 통화했습니까?

도움이 되었습니까?

해결책

예, 해당 코드에는 문제가 있습니다. 그것 드문 상황에서 잠재적으로 충돌을 일으킬 수있는 imgview를 너무 일찍 출시합니다. 인스턴스 변수에 객체를 보관하지 않고 저장하며 일반적으로 메모리 관리에 대한 잘못된 방법입니다.

이를 수행하는 올바른 방법 중 하나는 다음과 같습니다.

@interface SomeViewController : UIViewController
{
    UIImageView *imgView;
}
@property (nonatomic, retain) UIImageView *imgView;

그리고 구현에서;

@synthesize imgView;

모듈 어딘가 :

//Create a new image view object and store it in a local variable (retain count 1)
UIImageView *newImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];
newImgView.image = [UIImage imageNamed:@"someimage.png"];

//Use our property to store our new image view as an instance variable,
//if an old value of imgView exists, it will be released by generated method,
//and our newImgView gets retained (retain count 2)
self.imgView = newImgView;

//Release local variable, since the new UIImageView is safely stored in the
//imgView instance variable. (retain count 1)
[newImgView release];

//Add the new imgView to main view, it's retain count will be incremented,
//and the UIImageView will remain in memory until it is released by both the
//main view and this controller. (retain count 2)
[self.view addSubview:self.imgView];

그리고 거래는 동일하게 유지됩니다.

- (void) dealloc
{
    [imgView release];
    [super dealloc];
}

다른 팁

코드가 잘못되었습니다. 당신은 결국 풀릴 것입니다 imgView 거래 후.

.M 파일에서 : 귀하는 다음과 같습니다.

  1. alloc 그것은 -> 당신은 그것을 소유하고 있습니다
  2. 하위 뷰로 추가 -> 귀하와 UIView는 그것을 소유합니다
  3. release 그것은 -> 당신은 그것을 소유하지 않습니다

그런 다음 dealloc, 너 release 위의 3 단계에서 설정 한 것처럼 ImgView는 그것을 소유하지 않습니다. 전화 할 때 [super dealloc], View는 모든 하위 뷰를 출시 할 것이며, 예외를 얻을 수 있다고 생각합니다.

당신이 ivar를 유지하고 싶다면 imgView, 나는 제안한다 ~ 아니다 부름 release 하위 뷰로 추가 한 후에는 dealloc 똑같다. 그렇게하면 imgView View 계층에서 어느 시점에서 제거되면 여전히 유효한 참조가 있습니다.

코드가 올바르지 않습니다. DealLoc 호출 된 경우 (IVAR로 보관하려면 AddSubview 이후에 다른 곳에 대한 포인터가 필요하지 않으면 필요하지 않습니다. : 당신을 위해보기를 유지합니다).

실제로 충돌하지 않는 이유는 여전히 슈퍼 클래스에 의해 유지되고 있기 때문입니다 (호출에서 AddSubview에 대한 호출에서). 보기는 아마도 그 후 즉시 거래 될 때 수퍼 뷰에서 자체적으로 제거 될 것입니다. [super dealloc] 그것을 과도하게 릴리스하지 않는다고합니다. 그게 내 직감입니다.

init의 릴리스가 잘못되었습니다.

당신은 "일반적인 관행"과 이름이없는 책을 언급했습니다. Apple의 표준 예를 살펴 보는 것이 좋습니다 : ViewTransitions는이 경우에 좋은 예입니다 (그리고 부팅 할 2 개의 뷰;)

http://developer.apple.com/iphone/library/samplecode/viewtransitions/index.html

(나는 명성이 충분하지 않습니다 주석을 추가하십시오 아직.)

@Bentford : 내가 틀렸다면 나를 수정하지만 ImgView 속성의 합성 세터를 사용하려면 "self.imgview"를 사용해야한다고 생각합니다.

self.imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]

당신이 없다면 본인., 그것은 단지 IVAR을 사용하고 있으며 추가 보유를 얻지 못하고 있습니다.

기본적인 응답이가 되어야만 하는 [imgView release] 예제 코드에서(부 후 addSubview 또는 dealloc).그러나 내가 제거 [imgView release]dealloc 고 그것을 남겨 후 addSubview.

이하는 아이폰에서;가 didReceiveMemoryWarning, 할 수 있는 물체(을 포함한 전체 보기 다)아래에서 당신입니다.이 있는 경우 응용 프로그램을 유지하고 존중하지 않는 기억을 찾을 수 있는 응용 프로그램을 간단하게 죽였다.

좋은 예를 들어:
당신이 생각하는 경우가의 중첩된 설정의 3 망 보기 1->View2->View3.다음으로,고려'viewDidLoad'및'viewDidUnload'호출합니다.는 경우에는 사용자가 현재에는'3',그것을 가능하 View1 는 언로드,그리고 이것은 어디지합니다.
는 경우에 할당 개체 내부에 viewDidLoad 고 공개하지 않았다 추가한 후 그것의 하위 보기,다음 객체지 발표할 때 view1 언로드하지만,view1 은 여전히 언로드됩니다.
viewDidLoad 이 다시 실행하고 당신의 코드를 실행됩니다 다시,하지만 지금은 두 가지의 인스턴스화하는 대신 객체의 하나;하나는 개체에 nowhereland 으로 이전에 언로드 보고 새로운 객체에 대한 것입니다 현재 표시되는 뷰입니다.헹굼,거품,그리고 반복하고 당신이 찾을 수 있 응용 프로그램에서 메모리 누수를 방지합니다.

이 경우 예를 들어,주어진 블록의 코드입 휘발성하고 있는 기회를 실시(는지 여부를 메모리 또는 언로드 보기다),나는 것입 제거 [imgView release]; 에서 dealloc 고 그것을 남겨 후 addSubView.

여기에서 링크를 기본지/방출의 개념:http://www.otierney.net/objective-c.html#retain

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top