Objective c 改变数组中的对象
我有一个Objective c 改变数组中的对象,objective-c,arrays,reference,nsmutablearray,Objective C,Arrays,Reference,Nsmutablearray,我有一个ObjectManager类型的对象,它有一个NSMutableArray属性,我们称它为\u objArr\u objArr充满了类型为MyObject的对象。下面是MyObject typdef NS_ENUM(NSInteger, ObjectStatus) { ObjectStatusZero = 0, ObjectStatusOne = 1, ObjectStatusTwo = 2 } @interface MyObject : NSObject
ObjectManager
类型的对象,它有一个NSMutableArray
属性,我们称它为\u objArr
<代码>\u objArr充满了类型为MyObject
的对象。下面是MyObject
typdef NS_ENUM(NSInteger, ObjectStatus)
{
ObjectStatusZero = 0,
ObjectStatusOne = 1,
ObjectStatusTwo = 2
}
@interface MyObject : NSObject
@property (nonatomic, strong) NSDate *date;
@property (nonatomic, assign) ObjectStatus status;
@end
此问题涉及两种方法:userInitiatedMethod
和timeriInitiatedMethod:
。首先,调用userInitiatedMethod
:
- (void)userInitiatedMethod
{
MyObject *obj = _objArr[0];
obj.date = [NSDate dateWithHoursFromNow:1000];
obj.status = ObjectStatusTwo;
}
几秒钟后,计时器触发:
- (void)timerInitiatedMethod:(NSTimer*)timer
{
MyObject *obj = _objArr[0];
// do stuff with object
}
计时器是在ObjectManger
的init
方法中创建的:
if (_pruneTimer)
{
[_pruneTimer invalidate];
_pruneTimer = nil;
}
PULLog(@"starting pruning timer");
_pruneTimer = [NSTimer scheduledTimerWithTimeInterval:30
target:self
selector:@selector(p_pruneExpiredObjs)
userInfo:nil
repeats:YES];
计时器启动的方法将对象从
\u objArr
中删除,具体取决于obj.date
是否已过,这就是我发现错误的方式。在上述两种方法中设置断点,我验证是否首先调用了userInitiatedMethod
,并正确设置了对象。调用timerinitatedMethod:
时,我检查我的obj。只有obj.status
是新设置的值,obj.date
是第一个方法更改它之前的原始值。我已经验证了MyObject
实例的内存地址对于这两种方法都是相同的。为什么我的原语值会被正确保存,而不是引用到NSDate
?如果这是多线程的,那么很可能存在争用条件。“但更可能的是你有一个简单的错误。你如何创建你的计时器?你在setDate中尝试一个断点?”Andy更新了问题。在我读了第一条评论后,这听起来像是线程问题,因为计时器正在调用该方法,但调用时中断显示我们仍然在主线程上com.apple.main thread
您确定只有一个ObjectManager
和一个对象数组吗?您确定这两种方法访问的obj
是同一个对象吗?假设数组是可变的,是否有什么东西删除或插入了索引0处的对象?原始日期是什么,以及+dateWithHoursFromNow:
返回的是什么,它实际上不同吗?MyObject
的实现是否为date
属性提供了一个实例变量?它提供了setter吗?