Objective C块和变量

时间:2014-02-04 19:30:40

标签: variables objective-c-blocks

+ (NSArray *)getArrayOfBubblesWithTitles:(NSArray *)titles andMainBubble:(BubbleContainer *)mainB {
    UIColor *c = mainB.colour;
    Corner corner = [Styles getCornerForPoint:mainB.frame.origin];

    NSMutableArray *blocks = [[NSMutableArray alloc] init];
    NSUInteger count = titles.count;
    CGSize size = mainB.frame.size;
    //TODO: calculation blocks frame
    for (int a = 0; a < titles.count; a++) {
        PositionCalculationBlock x = ^{
            return [SimpleSelectionView getPositionOfObjectAtIndex:a outOfBubbles:count size:size fromCorner:corner];
        };

        [blocks addObject:x];
    }

    NSMutableArray *m = [[NSMutableArray alloc] init];

    for (int a = 0; a < titles.count; a++) {
        [m addObject:[[BubbleContainer alloc] initSubtitleBubbleWithFrameCalculator:blocks[a] colour:c title:titles[a] andDelegate:NO]];
    }

    return m;
}

我不确定我的块是否可以正常使用变量。在apple docs中它说Any changes are reflected in the enclosing lexical scope, including any other blocks defined within the same enclosing lexical scope.我不确定这意味着什么,但我认为这意味着我在for语句中使用变量a的地方,只会在每个中使用最高值a阻止而不是0计数。还使用那些实例变量(count,size)避免使用指向mainB之类的对象的强指针?这很难测试。我远离能够运行我的代码,所以如果你对块有任何了解,你可以批评吗?

由于

1 个答案:

答案 0 :(得分:2)

首先,要实现引用的行:

  

Any changes are reflected in the enclosing lexical scope, including any other blocks defined within the same enclosing lexical scope.

特别适用于块可变变量,即带有__block修饰符的变量。您在向我们展示的代码段中没有任何块可变变量,因此该行不适用。

  

我认为这意味着我在for语句中使用变量a时,只会在每个块中使用a的最高值而不是0-count

块中使用但在封闭范围内定义的变量通常是只读的 - 如果尝试进行更改,编译器会抱怨该变量不可分配。要进行更改,需要使用__block修饰符将变量标记为块可修改。对块可修改变量所做的更改将反映在封闭范围内。

以下是一个例子:

{
    __block int anInteger = 42;

    void (^testBlock)(void) = ^{
        NSLog(@"inside the block anInteger is: %i", anInteger);
        anInteger = 96;
    };

    NSLog(@"before the assignment anInteger is: %i", anInteger);
    anInteger = 84;

    NSLog(@"before the block anInteger is: %i", anInteger);
    testBlock();
    NSLog(@"after the block anInteger is: %i", anInteger);
}

输出结果为:

before the assignment anInteger is: 42
before the block anInteger is: 84
inside the block anInteger is: 84
after the block anInteger is: 96