我有一个UIViewController(称之为A),我已经保留并合成了一个NSDate实例。
在另一种方法中,我正在创建另一个UIViewController(称之为B)并希望将其传递给NSDate实例。在B中,我将使用它。我是否也应该保留和合成这个实例?我假设B将使用与A创建的相同的NSDate实例,并且如果内存用完,可能有可能在viewDidUnload中删除A的实例。
另一方面,如果我保留并合成它,当B的视图消失时,我将解除分配它。当我返回A时,NSDate实例消失了。
那么,这里的最佳做法是什么?我应该在B中创建一个新的NSDate对象,并使其与传入的对象相同吗?并保留/合成这个新实例?
答案 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。