我有一个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,当我在日志调用之后得到那个错误时,怎么会这样呢?
答案 0 :(得分:1)
初始化NSDate的方式返回一个自动释放实例,该实例将在事件循环结束时自动处理。使用[[NSDate date] retain]
,不要忘记手动释放它。
答案 1 :(得分:1)
你说你使用两个或更多线程。 所以,你应该按照以下方式定义属性,
@property (retain) NSDate *currentDate; ///< atomic default
这种方式可以保证此属性的线程安全。
编辑:
从@property中删除“nonatomic”,默认情况下它将表现为原子操作。原子操作将保证线程安全行为。