enumerateObjectsUsingBlock中的weakSelf?

时间:2014-05-07 20:10:16

标签: ios objective-c objective-c-blocks

我应该使用weakSelf,在以下代码中调用self时snippit(self.searchResults):

[self.restaurants enumerateObjectsUsingBlock:^(Restaurant *restaurant, NSUInteger idx, BOOL *stop) {
        if ([scope isEqualToString:@"All"] || [restaurant.name isEqualToString:scope]) {

            NSRange range = [restaurant.name rangeOfString:searchText
                                                   options:(NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)];
            if (range.length > 0) {
                [self.searchResults addObject:restaurant];
            }
        }

    }];

在块中调用self.searchResults时,我应该引用弱吗?

1 个答案:

答案 0 :(得分:6)

此处不需要

weak。将weak用于复制到块中的变量的目的是避免使用循环引用,并且您在此处没有风险 - 部分原因是该块未被保留。

考虑以下示例。在自己拥有的区块中捕获自我会导致无法打破的保留周期:

@interface MyObject : NSObject

@property (copy, nonatomic) void (^contrived)();

@end

@implementation MyObject

- (id) init
{
    self = [super init];
    if ( self )
    {
        self.contrived = ^{

            NSLog( @"%@", self.description );

        };
    }
    return self;
}

@end