ios - 如何在 Objective-C 中使用 enumerateByteRangesUsingBlock?

标签 ios objective-c nsdata

enumerateByteRangesUsingBlock: 方法在 NSData 类中,在 Apple 文档中解释如下:

Enumerate through each range of bytes in the data object using a block.
- (void)enumerateByteRangesUsingBlock:(void (^)(const void *bytes, NSRange byteRange, BOOL *stop))block

Parameters

block
The block to apply to byte ranges in the array.

The block takes three arguments:
bytes
The bytes for the current range.
byteRange
The range of the current data bytes.
stop
A reference to a Boolean value. The block can set the value to YES to stop further processing of the data. The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block.

讨论

枚举 block 为接收器中的每个连续内存区域调用一次(连续 NSData 对象总共调用一次),直到所有字节都已枚举,或者停止参数设置为 YES。

但我的问题是,这个 block 什么时候执行?哪个方法负责为 block 提供参数 bytesbyteRangestop?比如我要遍历bytes数组的一部分,应该怎么控制?

最佳答案

bytesbyteRangestop 参数由enumerateByteRangesUsingBlock 传递给您的 block 。您不指定要遍历哪些字节 - 您使用此方法遍历所有字节(您可以通过 stop 提前终止)。

举个简单的例子,假设您想搜索一些 NSData 来寻找 0xff。你可以使用 -

NSInteger ffFound=NSNotFound;
[myData enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
   for (NSInteger i=0;i<byteRange.length;i++) {
      if (bytes[i]== 0xff) {
         ffFound=byteRange.location+i;
         *stop=YES;
         break;
      }
   }
}];

if (ffFound != NSNotFound) {
    NSLog(@"0xFF was found at location %ld",(long)ffFound);
}

关于ios - 如何在 Objective-C 中使用 enumerateByteRangesUsingBlock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122374/

相关文章:

ios - 如何检查用户是否在网页中安装了移动应用程序?

ios - 如何从 Webview 的键盘获取完成按钮操作

objective-c - 在 Obj-C 中使用 C 语法调用静态方法?

cocoa-touch - 如何追加nsdata

arrays - 如何将不同类型的值转换为数据字节

ios - 如何将非英语语言设置为开发语言和Base本地化?

ios - 如何在 iOS 中将应用程序翻译成另一种语言?

iOS - 删除 UITabBarViewController 阴影

ios - UIImageView 显示扭曲的图像

swift - NSData(contentsOfURL : url) always returning nil