Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 改变数组中的对象_Objective C_Arrays_Reference_Nsmutablearray - Fatal编程技术网

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吗?