使用NSDate对象作为属性释放对象

时间:2013-08-03 08:13:46

标签: objective-c memory-management nsdate

我创建了一个具有NSDate属性的对象,如下所示:

MyClass.h

@interface MyClass: NSObject { NSDate *date_ }

@property (nonatomic, retain) NSDate *date;

MyClass.m

@implementation MyClass
@synthesize date=date_;

-(id) init
{
if (self=[super init])
    date_ = [NSdate date];

return self;
}

-(void) dealloc
{
[date_ release];
date_ = nil;
}

但是当我创建这个对象时

[[[MyClass alloc] init] autorelease];

当我的线程调用EXC_BAD_ACCESS时,我得到objc_release

如果我在init上添加一个retain:

 -(id) init
{
if (self=[super init])
{
    date_ = [NSdate date];  
    [date_ retain];
}
return self;
}

它似乎工作正常,但是并没有声明属性“保留”应该保留给我吗?

1 个答案:

答案 0 :(得分:2)

通过使用date(Ivar),你可以绕过setter的保留 - 这是你在init方法中要做的事情(不要在init中使用setter / getters但直接访问iVar)。 由于[NSDate date]返回一个自动释放的对象,您必须保留它。

要使用setter,您需要调用setter方法(self.date[self setDate:])。在这种情况下,对象会被setter自动保留。 除了在你的init和dealloc之外的任何地方都这样做。

另外我猜你的初始化中有一个拼写错误,你使用date作为iVar,它应该是你的合成所定义的date_这已被编辑为现在在OP中正确