避免像在 FMDatabaseQueue 中那样使用块方法使用 __block 变量保留计数

Avoid retain count with __block variable with block method like in FMDatabaseQueue

我正在使用 FMDatabaseQueue,我不想使用 __block 变量来保留计数,因为我有一个带有 return 值的方法,这是读取数据库,这是一个例子:

- (BOOL)existProduct:(int)id_product
{
    __block BOOL exist = NO;

    [self.dbQueue inDatabase:^(FMDatabase *db) {

        FMResultSet *pr_query = [db executeQuery:@"SELECT id FROM product WHERE id_product = ?",[NSNumber numberWithInt:id_product]];

        while ([pr_query next]) {

            exist = YES;
        }
    }];

    return exist;
}

文档是这样说的:

As described, instead, you can use a __block qualifier and set the myController variable to nil in the completion handler

MyViewController * __block myController = [[MyViewController alloc] init…];
// ...
myController.completionHandler =  ^(NSInteger result) {
    [myController dismissViewControllerAnimated:YES completion:nil];
    myController = nil;
};

但是我不能输入 exist = nil,因为这是我的 return 值,所以我该如何解决这个问题?

编辑:在某些情况下,我有对象而不是原始变量到 return 值,如下所示:

- (Product *)searchProduct:(int)id_product
    {
        __block Product *prod = nil;

        [self.dbQueue inDatabase:^(FMDatabase *db) {

            FMResultSet *pr_query = [db executeQuery:@"SELECT * FROM product WHERE id_product = ?",[NSNumber numberWithInt:id_product]];

            while ([pr_query next]) {

                prod = [[Product alloc] init]
                prod.id = ...
                ...
            }
        }];

        return prod;
    }

有什么问题吗? exists 是原始类型 (BOOL)。原始类型不会被保留、释放或释放。

你的第一个代码块没有问题。

尽管您可以将 while 更改为 if,因为您只想知道是否有任何数据。无需迭代所有结果。