问题标签 [nsfastenumeration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
618 浏览

objective-c - ARC中的NSFastEnumeration对象转换

我正在尝试在自定义类上实现NSFastEnumeration协议中的countByEnumeratingWithState:objects:count:方法。

到目前为止,我已经正确地迭代了我的对象,但是返回的对象不是 Objective-C 对象,而是核心基础等价物。

这是设置 state->itemsPtr 的代码部分:

MyCustomCollection.m

然后我像这样在其他地方调用'for..in'循环

其他类.m

控制台输出为:

如您所见,在 NSFastEnumeration 协议方法中,对象打印得很好,但是一旦它被强制转换,id __unsafe_unretained *我就会丢失原始的 Objective-C 对应类。

老实说,我不太确定(__unsafe_unretained id *)(__bridge void *)在这种情况下铸造是如何工作的。似乎要匹配正确的(__unsafe_unretained id *)类型 itemsPtr 需要。(__bridge void *)似乎使用 __bridge 转换为 void 类型的指针,用于将 obj-c 世界连接到 CF 世界。根据llvm 文档,对于__bridge

没有所有权转移,ARC 没有插入保留操作

那是对的吗?

据我了解,__NSCFConstantString 只是相当于 NSString 的核心基础。我也明白,使用 ARC,您需要从 Objective-C 对象桥接到 CoreFoundation 等价物,因为 ARC 不知道如何管理后者的内存。

我怎样才能让它工作,以便我的'for..in'循环中的对象是原始类型?

另请注意,在这种情况下,我将 NSStrings 添加到我的集合中,但理论上它应该支持任何对象。

更新

Rob 的答案是正确的,但为了测试这个理论,我将 for 循环更改为:

理论上应该可以工作,因为对象是等效的,但它会因以下错误而崩溃:

看起来for循环中返回的对象几乎是类而不是实例。这里可能有其他问题......对此有什么想法吗?

更新 2:解决方案

就这么简单:(感谢 CodaFi

0 投票
1 回答
138 浏览

objective-c - 自定义 NSFastEnumeration 方法?

我有一个将其数据存储在字典中的容器类

我想枚举对象而不是键。

现在我有这样的代码

0 投票
1 回答
2062 浏览

objective-c - enumerateObjectsUsingBlock: 比 for-in 循环快吗?为什么?

我正在阅读关于枚举的 NSHipster 文章,该文章声称 for-in 循环比enumerateObjectsUsingBlock:

除非您在迭代时确实需要数字索引,否则使用 for/in NSFastEnumeration 循环几乎总是更快。

这个答案为该引用提供了一些反驳:

快速枚举需要从内部表示转换为快速枚举的表示。其中有开销。基于块的枚举允许集合类以最快的速度遍历本机存储格式来枚举内容。

从内部表示转移到快速枚举表示的翻译过程是什么?我知道那里有一些开销,但有多少?

0 投票
1 回答
294 浏览

ios - iOS:修改 NSFastEnumerationState 以在枚举时隐藏突变

我有一个案例,我的集合在枚举时会发生突变。但这在 iOS 中是不允许的。进一步调查发现 NSFastEnumerationState 是 ac 类型结构,如下所示

所以 state->mutationPtr 表示集合是否发生了变异,基于哪些异常被抛出。我们是否可以覆盖这个来表明集合没有发生变异(即使它已经发生了变异),这样就不会抛出异常。通过覆盖我们可以在枚举时实现突变。我不知道这是否是一个正确的想法。请让我知道您的建议。

0 投票
2 回答
3122 浏览

objective-c - 使用 NSPointerArray,如何迭代不透明的指针?

我最近发现了像NSMapTableand这样的类NSPointerArray,它们的工作方式类似于传统的集合,但也可以让您存储弱引用或普通的旧 C 指针。不幸的是,您似乎无法使用该for...in语法来迭代非NSObject指针。例如:

编译器不喜欢最后一行。错误:

选择器元素类型“Segment *”(又名“struct Segment *”)不是有效对象

那么,我需要这样做吗?

那不是世界末日,但我只是想确定一下。

0 投票
1 回答
1409 浏览

ios - 如何为内部使用 NSMutableArray 的类实现 countByEnumeratingWithState:objects:count:

我想用

TBL_CardView 是我的自定义类,cardsInHand只是(TBL_CardViewArray*)

所以我需要countByEnumeratingWithState:objects:count:为我的TBL_CardViewArray班级实施。
这个对吗 ?

这是我的 TBL_CardViewArray.h

TBL_CardViewArray.m 中的一些重要部分

所以我只是TBL_CardViewArray在 NSMutableArray 周围使用 as s 包装器来存储我的TBL_CardView类。

问题
如何为我的TBL_CardViewArray班级实施 countByEnumeratingWithState:objects:count:。

我确实谷歌了它,但没有找到一些我可以轻松重用的例子。
我的假设是,因为我已经在使用 NSMutableArray 进行存储,所以它并没有那么复杂,但我不知道怎么做?

0 投票
1 回答
81 浏览

ios - 如何在 ios 中使用快速枚举从滚动视图的所有子视图中获取固定数量的子视图

如何使用 ios 中的快速枚举从滚动视图的所有子视图中选择固定数量的子视图?

0 投票
0 回答
19 浏览

ios - 类成员的 NSFastEnumeration

如何为返回所有类成员变量的枚举的自定义类实现 NSFastEnumeration?

我正在尝试使用 CHCSVParser(https://github.com/davedelong/CHCSVParser)将此数据导出到 csv。如何在 Employee 类对象数组上调用 writeLineOfFields?

0 投票
1 回答
2689 浏览

ios - NSFastEnumeration in Swift 3

I am trying to iterate over a object of CMSensorDataList class returned by CMSensorRecorder.accelerometerData(from:to:). This class confirms to NSFastEnumeration protocol. So I tried the trick mentioned in https://stackoverflow.com/a/25872991/5603109. However since I am using Xcode Version 8.0 beta (8S128d), it no longer works.

What can I do to make it support for-in loops?

0 投票
3 回答
221 浏览

objective-c - 为什么循环变量在循环后变为`nil`

我有:

循环块永远不会改变server

servers是一个NSMutableArraywith 字典,一个在循环期间没有改变的属性。

为什么循环结束后server有值?nil

是我第一次在循环之后使用这样的变量。没有想太多,我认为它会像(在旧的 C 时代)一样工作: