无法弄清楚为什么我的对象被取消分配

时间:2010-08-30 06:06:03

标签: iphone objective-c memory-management

我有一个NSDate对象,我在我的iPhone应用程序的主线程中使用它,我也从后台线程引用它,它的定义如下:

//header
NSDate *currentDate;
@property (nonatomic, retain) NSDate *currentDate;

//implementation file
@synthesize currentDate;

然后在我的应用程序中,我调用了一个refreshData方法,该方法将该对象传递给另一个帮助器类以从远程服务获取一些数据:

- (void) reloadData: (NSInvocationOperation*)operation  
{
    //...
    NSMutableArray *results = [managerHelper refreshForAddress: address 
                                                      timeFrom: fromDate
                                                        timeTo: self.currentDate];
    //...
}

(注意上面的调用是在后台线程上)

现在,在辅助类的一侧,我添加了这些行

- (NSMutableArray*) refreshForAddress:(NSString *)address 
                            timeFrom:(NSDate*) fromDate 
                              timeTo:(NSDate*) toDate
{
    debugLog(@"retain count: %i", [toDate retainCount]);
    NSNumber *toTimeNumber = [[NSNumber alloc] initWithDouble: [toDate timeIntervalSince1970]*1000];
    debugLog(@"after retain count log");
}

但我得到了经典错误:“*** - [__ NSDate timeIntervalSince1970]:消息发送到解除分配的实例0x71beea0”

记录说:

MyApp [5487:7903]保留计数:2 MyApp [5487:7903] *** - [__ NSDate timeIntervalSince1970]:消息发送到解除分配的实例0x71beea0

所以,正如你可以看到最后一个日志语句没有被调用,但是retainCount是2,当我在日志调用之后得到那个错误时,怎么会这样呢?

2 个答案:

答案 0 :(得分:1)

初始化NSDate的方式返回一个自动释放实例,该实例将在事件循环结束时自动处理。使用[[NSDate date] retain],不要忘记手动释放它。

答案 1 :(得分:1)

你说你使用两个或更多线程。 所以,你应该按照以下方式定义属性,

@property (retain) NSDate *currentDate;  ///< atomic default

这种方式可以保证此属性的线程安全。

编辑:

从@property中删除“nonatomic”,默认情况下它将表现为原子操作。原子操作将保证线程安全行为。