我创建了一个具有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;
}
它似乎工作正常,但是并没有声明属性“保留”应该保留给我吗?
答案 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中正确