块中使用的NSMutableArray实例

Roc*_*ina 2 block objective-c ios

以下代码段使用GCD计算一组整数并将它们存储在数组中.

factArray = {1!,2!,... n!}其中k!表示阶乘(k)= k*(k-1)*...*2*1.

我想知道为什么我可以在块内添加对象factArray变量(NSMutableArray的实例)尽管factArray没有使用__block限定符声明.

NSUInteger n = 10;
NSMutableArray *factArray = [[NSMutableArray alloc] initWithCapacity:n];
__block NSUInteger temp = 1;
dispatch_apply(n,
               dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
               ^(size_t s) {
                   NSUInteger w;
                   temp *= floor(s) + 1;
                   w = temp;
                   [factArray addObject:@(w)];
               });

__block NSArray *sortedArray;
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    sortedArray = [factArray sortedArrayUsingComparator:^NSComparisonResult(NSNumber *n1, NSNumber *n2) {
        return [n1 compare:n2];
    }];
    NSLog(@"%@", sortedArray);
});
Run Code Online (Sandbox Code Playgroud)

当然,如果我们添加__block限定符,此代码仍然有效.

Jos*_*ell 6

factArray是一个变量,就像temp.这是一个指针 ; 它保存了其他内存的地址.Block获取该指针的副本,就像获取副本一样temp.但是,指向的对象不会被复制.它停留在同一个地方,仍然是一个NSMutableArray.您可以通过指针向它发送消息; 这不会改变指针的值.它仍然指向同一个地方,并且可以在不更改指针的情况下修改对象的内容.

如果你想摆脱现有的数组并创建一个新的数组,并调用该数组factArray:

dispatch_apply(n, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
               ^(size_t s) {
                   factArray = [NSMutableArray array];
});
Run Code Online (Sandbox Code Playgroud)

那么你将改变指针的值,然后你需要说明__block符.

通俗地说,由于ObjC对象只能通过指针访问,我们经常将指针称为对象.区别在很大程度上是不重要的; 这是有史以来的一次.