避免像在 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
,因为您只想知道是否有任何数据。无需迭代所有结果。
我正在使用 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
,因为您只想知道是否有任何数据。无需迭代所有结果。