2011-08-04 7 views
0

나는 이미 유지하고 합성하고있는 NSDate 인스턴스로 UIViewController (A라고 함)를 가지고있다.다른 객체의 유지 된 변수를 유지 하시겠습니까?

또 다른 방법으로 다른 UIViewController (B라고 함)를 만들고 NSDate 인스턴스를 전달하고 싶습니다. B에서 나는 그것을 사용하려고합니다. 이 인스턴스도 유지하고 합성해야합니까? B가 A와 동일한 NSDate 인스턴스를 사용한다고 가정하고, 메모리가 부족하면 A의 인스턴스를 viewDidUnload에서 삭제할 수있는 가능성이있을 수 있습니다.

반면에 나는 그것을 보존하고 합성하면 B의 관점이 사라지면 그것을 할당 해제 할 것입니다. 그리고 A로 돌아 가면 NSDate 인스턴스가 사라집니다.

여기에있어 가장 좋은 방법은 무엇입니까? B에서 새로운 NSDate 객체를 만들고 전달 된 날짜와 동일한 날짜로 설정해야합니까? 이 새로운 인스턴스를 보유/합성 할 수 있습니까?

답변

0

질문에 대한 오해가있을 수 있지만 목표 C에서 참조 계산이 작동하는 방식에 대해 매우 잘 알고있는 것 같지 않습니다. (나는 그것에 대해 어떤 위반도하지 않으며,). 적절하게 메모리를 관리하는 경우 B의보기가 사라지면 NSDate 인스턴스의 할당이 해제되지 않습니다. 설정은 다음과 같아야합니다. 당신의 B 인스턴스가 해제 될 때

// A.h 
@property(nonatomic, retain) NSDate *myDate; 
@synthesize myDate; 

// A.m 
- (id) init 
{ 
    if (self = [super init]) 
    { 
     // Setter retains the new NSDate instance; its reference count is now 1 
     // (after autorelease) 
     [self setMyDate:[NSDate date]]; 
    } 

return self; 
} 

- (void) someMethod 
{ 
    // Assume b is a pointer to your B instance. B's setter retains the NSDate 
    // again; it's reference count is now 2 
    [b setMyDate: myDate]; 
} 

- (void) dealloc 
{ 
    [myDate release]; 
} 

// B.h 
@property(nonatomic, retain) NSDate *myDate; 
@synthesize myDate; 

// B.m 
- (void) dealloc 
{ 
    // Assuming B is deallocated first, the NSDate's reference count will 
    // now be 1. It will still be accessible to the A. 
    [myDate release]; 
} 

지금, 당신의 NSDate 인스턴스는 가 발표 될 것입니다. 해제되는 것은 할당 해제되는 것과 같은 것이 아닙니다. 해제 된 개체는 원래 A 인스턴스에 의해 유지 되었기 때문에 여전히 1의 참조 횟수를 갖습니다. NSDate 인스턴스는 A 인스턴스가 인스턴스를 해제하고 참조 횟수가 0이 될 때까지 할당이 취소되지 않습니다. 희망이 도움이됩니다.

Objective C의 메모리 관리에 대한 자세한 내용은 here을 참조하십시오. this question을 참조하십시오.

+0

그러나 B의 viewDidUnload에서 NSDate 인스턴스는 nil로 설정됩니다. 아직도 A가 그것을 유지할 때 이것이 문제가되지 않습니까? 또는 viewDidUnload에서 nil로 설정하지 않아야합니까? –

+0

'A'와'B'는 NSDate 인스턴스에 대한 별도의 포인터를 유지합니다. B의'viewDidUnload'가 호출되면 _pointer_를'NSDate' 인스턴스에'nil'으로 설정합니다. 인스턴스 자체는 여전히 메모리에 존재하며 여전히 'A'에 액세스 할 수 있습니다. ** 처음에 포인터를 놓지 않고'NSDate' 포인터를'nil'으로 설정하면 ** ** 문제가됩니다. 그게 NSDate의 유지 카운트가 제대로 감소하지 않기 때문에 메모리 누수를 일으킬 것이다. 그래서 결코 할당 해제되지 않을 것이다. –

+0

'viewDidUnload'에서'NSDate'를 해제하고'nil'할지 어떨지에 관해서는 그렇게 할 가치가 없을 것이라고 생각합니다.여전히'A'에 의해 유지되기 때문에,'B'의'viewDidUnload'가 호출 될 때 당신의'A' 인스턴스가 여전히 존재한다면 그것은 메모리로부터 해방되지 않을 것입니다. 따라서, 당신은 그 방법으로 그것을 공개함으로써 실제로 어떤 것도 성취하지 못합니다. –

0

나는 당신이 원하는 것을 완전히 이해합니다. 나는 NSDate에 대한 재산을 제안합니다. B의 ViewController에서

//.h

NSDate *date; 

@property(nonatomic,retain) NSDate *date; 

//.m 

@synthesize date; 

및 사용 날짜입니다. 지금 처음 수행하는 작업은 viewDidLoad이 아니어야하며 viewWillAppear이어야합니다. 이것은 B에서 A으로 viewWillAppear이 항상 호출 될 때 날짜 값을 얻는 데 도움이됩니다.

관련 문제