0

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

我的类.h

@interface MyClass: NSObject { NSDate *date_ }

@property (nonatomic, retain) NSDate *date;

我的班级.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

如果我在初始化时添加保留:

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

它似乎工作正常,但不是用“保留”声明财产应该为我保留它吗?

4

1 回答 1

2

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

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

另外我猜有一个错字,因为在您的 init 中您使用dateiVar,它应该date_由您的合成定义。这已被编辑为现在在 OP 中是正确的

于 2013-08-03T08:25:16.730 回答