如何在Objective-C中使用enumerateByteRangesUsingBlock?

htr*_*eaf 4 objective-c nsdata ios

该方法enumerateByteRangesUsingBlock:在课堂上NSData,并在Apple文档中解释如下:

使用块枚举数据对象中的每个字节范围.
- (void)enumerateByteRangesUsingBlock:(void (^)(const void *bytes, NSRange byteRange, BOOL *stop))block

参数

block
要应用于数组中字节范围的块.

该块有三个参数:
bytes
当前范围的字节.
byteRange
当前数据字节的范围.
stop
对布尔值的引用.该块可以将值设置为YES以停止进一步处理数据.stop参数是一个out-only参数.您应该只在块中将此布尔值设置为YES.

讨论

枚举块被调用一次用于接收器中的每个连续内存区域(对于连续的NSData对象一次),直到枚举所有字节或者将stop参数设置为YES.

但我的问题是,块何时执行?哪个方法负责提供参数bytes,byteRange以及stop块?例如,如果我想遍历一部分字节数组,我该怎么做才能控制?

Pau*_*w11 8

bytes,byteRangestop参数传递给你块通过enumerateByteRangesUsingBlock.您没有指定要遍历的字节 - 您使用此方法遍历所有字节(您可以通过早期终止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);
}
Run Code Online (Sandbox Code Playgroud)

  • 看看文档.它是"当前范围的字节"和"当前数据字节的范围".可以说数据有100个字节.它可能有两个块.第一个可能是前40个字节.`bytes`参数将是那40个字节,`byteRange`将是0,40.第二遍`bytes`参数将是接下来的60个字节,范围将是40,60.在这两种情况下,范围的第一个字节都是索引0,但`byteRange.location`都不是0.所以你当前的代码应该工作. (3认同)