保留另一个对象的保留变量?

时间:2011-08-04 04:02:51

标签: iphone objective-c

我有一个UIViewController(称之为A),我已经保留并合成了一个NSDate实例。

在另一种方法中,我正在创建另一个UIViewController(称之为B)并希望将其传递给NSDate实例。在B中,我将使用它。我是否也应该保留和合成这个实例?我假设B将使用与A创建的相同的NSDate实例,并且如果内存用完,可能有可能在viewDidUnload中删除A的实例。

另一方面,如果我保留并合成它,当B的视图消失时,我将解除分配它。当我返回A时,NSDate实例消失了。

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

2 个答案:

答案 0 :(得分:0)

我完全明白你想要什么。我建议你为NSDate建立财产。

//。h

NSDate *date;  

@property(nonatomic,retain) NSDate *date;  

//.m  

@synthesize date; 

B viewcontroller中使用日期。 现在,您最初在日期执行的操作不应位于viewDidLoad,它们应位于viewWillAppear。当您从 B 返回 A 时,这将帮助您获取日期值,因为始终会调用viewWillAppear

答案 1 :(得分:0)

我可能会误解你的问题,但这听起来并不像你对目标C中引用计数的工作方式有很好的了解。(我并不是说有任何冒犯行为;获得它可能很棘手如果您正确管理内存,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];
}

现在,当您的B实例被取消分配时,您的NSDate实例将被释放。被释放与被解除分配不同。释放的对象仍将具有引用计数1,因为它最初由A实例保留。在NSDate实例释放它并且其引用计数降至零之前,A实例将不会被释放。希望有所帮助。

目标C中有关内存管理的更多信息可用here。另请参阅this question