相关疑难解决方法(0)

Objective-C的NSMutableArray是否是线程安全的?

我一直试图解决这个崩溃将近一个星期.应用程序崩溃,没有任何异常或堆栈跟踪.在僵尸模式下运行仪器时,应用程序不会以任何方式崩溃.

我有一个在不同的线程上调用的方法.修复崩溃的解决方案正在取代

[self.mutableArray removeAllObjects];
Run Code Online (Sandbox Code Playgroud)

dispatch_async(dispatch_get_main_queue(), ^{
    [self.searchResult removeAllObjects];
});
Run Code Online (Sandbox Code Playgroud)

我认为这可能是一个时间问题,所以我尝试同步它,但它仍然崩溃:

@synchronized(self)
{
    [self.searchResult removeAllObjects];
}
Run Code Online (Sandbox Code Playgroud)

这是代码

- (void)populateItems
{
   // Cancel if already exists  
   [self.searchThread cancel];

   self.searchThread = [[NSThread alloc] initWithTarget:self
                                               selector:@selector(populateItemsinBackground)
                                                 object:nil];

    [self.searchThread start];
}


- (void)populateItemsinBackground
{
    @autoreleasepool
    {
        if ([[NSThread currentThread] isCancelled])
            [NSThread exit];

        [self.mutableArray removeAllObjects];

        // Populate data here into mutable array

        for (loop here)
        {
            if ([[NSThread currentThread] isCancelled])
                [NSThread exit];

            // Add items to mutableArray
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

NSMutableArray的这个问题不是线程安全的吗?

multithreading objective-c nsmutablearray ios

50
推荐指数
5
解决办法
3万
查看次数

如何在枚举期间删除NSMutableArray或NSMutableDictionary中的元素?

我使用类似于以下代码的基于块的枚举:

[[[rows objectForKey:self.company.coaTypeCode] objectForKey:statementType] 
    enumerateObjectsWithOptions:NSEnumerationConcurrent 
                     usingBlock:^(id coaItem, NSUInteger idx, BOOL *stop) { 
// block code here
}]
Run Code Online (Sandbox Code Playgroud)

我想在枚举过程中删除一些对象,具体取决于它们的对象值.

我怎么能这样做?我知道在枚举期间操纵可变数组或字典(NSMutableArray或NSMutableDictionary)通常是不可能的.

实现这个的最佳方法是什么?

谢谢!

objective-c nsmutablearray nsmutabledictionary ios objective-c-blocks

12
推荐指数
2
解决办法
2万
查看次数

从NSArray中删除对象

如何从反转中删除对象NSArray.

目前我有一个NSMutableArray,然后我反过来

NSArray* reversedCalEvents = [[calEvents reverseObjectEnumerator] allObjects];
Run Code Online (Sandbox Code Playgroud)

现在我需要从项目中删除reversedCalEventscalEvents自动刷新数组根据条件显示的表.即

if(someInt == someOtherInt){
    remove object at index 0
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我无法让它发挥作用.

objective-c uitableview nsmutablearray nsarray ios

4
推荐指数
2
解决办法
4万
查看次数

应用程序崩溃与NSMutableArray

我对iOS很陌生,我不知道如何找到像JAVA这样体面的堆栈跟踪,所以我能找到它崩溃的原因是"sigabrt".

我知道它与我刚刚添加的代码有关.

-(void) clearGame {
    for (CCSprite *sprite in placedSprites) {
        if(sprite == nil) continue;
        [self removeChild:sprite cleanup:NO];
        [placedSprites removeObject:sprite];
    }
    placedSprites = [[NSMutableArray alloc] initWithCapacity:1000];
}
Run Code Online (Sandbox Code Playgroud)

我正在添加它的类是cocos2d中的一个层.在它的init方法中,我有

placedSprites = [[NSMutableArray alloc] initWithCapacity:1000];
Run Code Online (Sandbox Code Playgroud)

我不知道什么是错的,所以任何帮助都表示赞赏.

谢谢!

cocos2d-iphone ios

2
推荐指数
1
解决办法
854
查看次数

用于删除NSMutableArray崩溃中的项目的快速枚举

我有一个奇怪的问题,如果我在forin枚举中删除我的项目,它会崩溃,所以像这样:

for (Obstacle *obstacleToTrack in _obstaclesToAnimate) {
    //this if else not so important for happening crash
    if(obstacleToTrack.distance > 0){
        obstacleToTrack.distance -= _playerSpeed * _elapsed;
    }else{
        if (obstacleToTrack.watchOut) {
            obstacleToTrack.watchOut = NO;
        }
        obstacleToTrack.x -= (_playerSpeed + obstacleToTrack.speed) * _elapsed;
    }
    if (obstacleToTrack.x < -obstacleToTrack.width || _gameState == GS_OVER) {
        [self removeChild:obstacleToTrack];
        //this line makes crash happen , if remove this line code work fine
        [_obstaclesToAnimate removeObject:obstacleToTrack];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我改变我的代码

NSMutableArray *forRemoving = [[NSMutableArray alloc]init];
for (Obstacle *obstacleToTrack in _obstaclesToAnimate) { …
Run Code Online (Sandbox Code Playgroud)

objective-c nsmutablearray fast-enumeration

2
推荐指数
1
解决办法
2551
查看次数


阵列枚举期间应用程序崩溃

这段代码有什么问题?我明白了

 Collection <NSCFArray: 0x101e1b6d0> was mutated while being enumerated
Run Code Online (Sandbox Code Playgroud)

它是NSMutableArray,而不是NSArray

NSMutableArray *set = [[NSMutableArray alloc]initWithObjects:@"first", @"second", @"third", @"third", nil];

    [set enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
     {
         if([obj isEqualToString:@"third"])
         {
             [set removeObjectAtIndex:idx];
         }
     }];

    [pool drain];
Run Code Online (Sandbox Code Playgroud)

enumeration objective-c ios

0
推荐指数
2
解决办法
1351
查看次数