标签: fast-enumeration

核心数据/ NSOperation:枚举和删除对象时崩溃

我有一个基于核心数据的应用程序,它有一个对象(列表)到许多对象(列表项)关系.我正在设备之间同步数据,作为其中一部分,我从后台线程中的XML文件导入列表(通过NSOperation子类).

当我更新现有列表时,我删除了所有旧列表项(来自特定于该线程的NSManagedObjectContext)并将其替换为XML文件中的新列表...删除是通过枚举项目来处理的列表:

for (ListItemCD *item in listToUpdate.listItems) {
    [self.importContext deleteObject:item];
}
Run Code Online (Sandbox Code Playgroud)

但是,有一段时间,我在枚举期间遇到了崩溃:

*由于未捕获的异常'NSGenericException'而终止应用程序,原因:'* Collection <_NSFaultingMutableSet:0x4fcfcb0>在枚举时发生了变异.

我不知道从哪里开始寻找问题的原因.在枚举发生时,我不会修改代码的任何其他部分中的列表.可以同时存在多个线程,因为导入/更新了不同的列表...将在另一个线程中保存上下文导致问题 - 因为它还通知主要上下文(如果它与枚举同时发生) ?

如果它有帮助,这里是来自我的NSOperation子类的"main"函数的代码(我从Core Data中删除旧的列表项,并通过解析XML数据来更新列表):

- (void)main {

    // input the xml data into GDataXML
    NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:self.filePath];
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];



    // get the list name (so that I know which list to update)
    NSString *listName;
    NSArray *listNames = [doc.rootElement elementsForName:@"listName"];
    if (listNames.count > 0) {
        GDataXMLElement *listNameElement = (GDataXMLElement *) [listNames objectAtIndex:0];
        listName …
Run Code Online (Sandbox Code Playgroud)

core-data nsoperation fast-enumeration ios

8
推荐指数
1
解决办法
6572
查看次数

为什么NSFastEnumeration快?

有没有人知道是否NSFastEnumeration真的更快(如在运行时性能)比使用NSEnumerator或(对于数组)使用整数计数器并循环元素?

如果它确实更快,它如何达到这个速度?

或许"快速"实际上指的是编写迭代代码的速度更快?

提前致谢.

performance cocoa iterator objective-c fast-enumeration

8
推荐指数
2
解决办法
1356
查看次数

Objective C:使用快速枚举时的最后一个对象?

在使用快速枚举时,知道何时到达数组中的最后一个对象的最佳方法是什么?有没有比增加int然后将其与数组长度进行比较更好的方法?

iphone for-loop objective-c fast-enumeration

6
推荐指数
1
解决办法
3953
查看次数

为我的班级采用/实现快速枚举的示例?

我正在尝试理解如何为我正在创建的类采用快速枚举协议(在iOS /目标C下).我阅读了Apple的文档部分,但是......我不太明白!

有人可以查看一些示例代码吗?

我正在尝试做的事情:我有一个对象数组,我想让发送者迭代.发件人想要使用for-in构造.问题是我不希望发送者看到数组中的所有对象,因为其中一些对象在应用程序的上下文中无效.

换句话说,我希望我的迭代器返回符合特定条件的数组中的对象子集.

我不想在这个过程中创建任何新的数组,以免减慢速度.

objective-c fast-enumeration

6
推荐指数
1
解决办法
2936
查看次数

你如何停止快速枚举?

一旦你得到你想要的东西,你将如何停止快速枚举.

在for循环中,我知道你只需将计数器数设置为千分之一.例:

for (int i=0;i<10;i++){
    if (random requirement){
        random code
        i=1000;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以没有将快速枚举转换为正向循环类型的东西(通过比较我[array count]如何在过程中停止快速枚举?

for-loop objective-c fast-enumeration for-in-loop

6
推荐指数
1
解决办法
3167
查看次数

是否可以将for循环重新启动到第一次迭代?

在Objective-C中,是否可以重新启动到for循环的第一次迭代?在我找到一个"好"的对象之前,我不想对我的对象做任何事情,此时我想回去做每个对象的东西直到那个好对象.

所以,

bool someflag = false;
for (id object in array)
{
  if(object is good) 
  {
    someflag = true;
    //restart to first object in loop
  }
  if(someflag)
  {
    doStuffWithObject(object);
  }
}
Run Code Online (Sandbox Code Playgroud)

或者有不同的/更好的方式来做我想做的事情?

显然,简单的方法是只有两个独立的for循环 - 所以如果我能得到第二个意见告诉我这是最好的方式,那就是我要拍的东西.出于某种原因,我觉得必须有更好的方法.

for-loop objective-c fast-enumeration

6
推荐指数
1
解决办法
804
查看次数

通过UICollectionView单元快速枚举 - Swift

我试图快速枚举我的所有集合视图单元格,但是下面的这个实现给了我一个警告.

for cell in self.collectionView?.visibleCells() as [UICollectionViewCell] {

    // Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

第一行显示以下错误:

postfix的操作数'?' 应该有可选的类型; type是'(UICollectionView,cellForItemAtIndexPath:NSIndexPath) - > UICollectionViewCell'

我已经尝试搞乱选项,并在Xcode 6 Beta 6中使用它,但在"Beta 7"中无济于事

我该如何摆脱这个错误?/写一个循环遍历我的所有CollectionView单元格?

fast-enumeration ios uicollectionview uicollectionviewcell swift

6
推荐指数
1
解决办法
2482
查看次数

删除for循环中的项目没有副作用?

我可以删除我在Objective-C for循环中循环的项目而没有副作用吗?

例如,这样可以吗?

for (id item in items) {
   if ( [item customCheck] ) {
      [items removeObject:item];   // Is this ok here?
}
Run Code Online (Sandbox Code Playgroud)

for-loop objective-c nsmutablearray nsarray fast-enumeration

5
推荐指数
1
解决办法
3225
查看次数

不同类型NSArray的快速计数

我在这里有这个问题(以及关于SO的其他问题),以及有关Objective-C集合和快速枚举的Apple文档.不清楚的是,如果NSArray填充了不同类型,并创建了一个循环,如:

for ( NSString *string in myArray )
    NSLog( @"%@\n", string );
Run Code Online (Sandbox Code Playgroud)

这到底发生了什么?循环会跳过任何不是的东西NSString吗?例如,如果(为了参数)a UIView在数组中,当循环遇到该项时会发生什么?

objective-c fast-enumeration

5
推荐指数
1
解决办法
5696
查看次数

循环如何在内部工作 - 目标C - 基础

我找到了这个答案:

/sf/answers/361433411/

其中介绍了如何for in实现循环.

NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
    for (NSUInteger i = 0; i < __count; i++) {
        id obj = __objects[i];
        [obj doSomething];
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我发现它错了.

首先,当您启用自动引用计数(ARC)时,您会收到错误消息

Sending '__strong id *' to parameter of type '__unsafe_unretained_id*' changes retain/release properties of pointer

错误的屏幕截图

但即使我关闭ARC,我发现__object数组似乎表现得很奇怪:

error2的屏幕截图

这是实际代码(我假设MAX_STACKBUFF_SIZE为40):

@autoreleasepool {

        NSArray *myArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
        int MAX_STACKBUFF_SIZE = 40;
        NSFastEnumerationState __enumState = {0}; …
Run Code Online (Sandbox Code Playgroud)

objective-c foundation fast-enumeration for-in-loop ios

5
推荐指数
1
解决办法
663
查看次数