2011-08-04 203 views
0

我有一个UIViewController(称为它)与我已经保留和合成的NSDate实例。保留来自另一个对象的保留变量?

在另一种方法,我创建另一个UIViewController中(称为B),并希望通过它的NSDate实例。在B中,我将要使用它。我是否也应该保留并综合这个实例?我假设B将使用A创建的同一个NSDate实例,并且如果内存不足,可能会在viewDidUnload中删除A的实例。

在另一方面,如果我保留和合成它,我要释放它当B的看法已经一去不复返了。当我回到A时,NSDate实例消失了。

那么,什么是最好的做法吗?我应该在B中创建一个新的NSDate对象,并使其与传入的日期相同?并保留/综合这个新的实例?

回答

0

我可能误解了你的问题,但它听起来并不像你的引用计数的目的C.如何工作的一个非常好的主意(我的意思不是通过任何罪行;它可以是棘手的)如果你正确地管理你的内存,当B的视图消失时,你的NSDate实例将不会被释放。你的设置应该是这样的。现在

// 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]; 
} 

,当你B实例被释放,你NSDate实例将释放。被释放与被释放不同。释放的对象仍然具有1的引用计数,因为它最初由A实例保留。 NSDate实例将不会被释放,直到A实例释放实例并且其引用计数降为零。希望有所帮助。对目标C内存管理

更多信息,请here。另见this question

+0

但是在B的viewDidUnload中,NSDate实例被设置为nil。 A仍然保留它不是一个问题吗?或者我不应该在viewDidUnload中将其设置为零? –

+0

'A'和'B'分别维护指向'NSDate'实例的指针。当调用B的'viewDidUnload'时,你将它的_pointer_设置为'NSDate'实例为'nil'。实例本身仍然存在于内存中,仍然可以通过'A'访问。它**是一个问题,如果你没有先释放它,将指针设置为'NSDate'为'nil'。这将导致内存泄漏,因为'NSDate'的保留计数将不会正确递减,因此永远不会被释放。 –

+0

关于你是否应该释放''viewDidUnload'中的'NSDate',否则我认为这可能是不值得的。由于它仍然由'A'保留,所以如果当'B'的'viewDidUnload'被调用时''A实例仍然存在,它将不会被释放。因此,你并没有通过在该方法中释放它来完成任何事情。 –

0

我完全明白你想要什么。我建议你为NSDate设置房产。

//.h

NSDate *date; 

@property(nonatomic,retain) NSDate *date; 

//.m 

@synthesize date; 

而且使用日期视图 - 控制。 现在您最初执行日期的操作不应该在viewDidLoad中,它们应该在viewWillAppear之内。这将有助于你得到的日期值,当你从一个作为viewWillAppear总是叫回来。