Xcode 认为由于 if/else 语句中的返回,控制可能会到达非 void 函数的末尾

Posted

技术标签:

【中文标题】Xcode 认为由于 if/else 语句中的返回,控制可能会到达非 void 函数的末尾【英文标题】:Xcode thinks control may reach end of non-void function due to returns in if/else statements 【发布时间】:2013-02-21 07:21:18 【问题描述】:

这是一个简单的问题:为什么下面的代码会导致“控件可能到达非无效函数的结尾”警告?在什么情况下两个 return 语句之一不会被命中?将第二个return 语句放在else 块之外是否是更标准的编码实践?这确实使警告静音,但我很好奇它为什么存在。

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath

    NSString *lineToFit = [[self.fetchedResultsController objectAtIndexPath: indexPath] line];
    NSString *actorToFit = [[self.fetchedResultsController objectAtIndexPath: indexPath] actor];
    CGSize lineSize = [lineToFit sizeWithFont: [UIFont boldSystemFontOfSize: 12.0f] constrainedToSize: CGSizeMake(320, 800)];
    CGSize actorSize = [actorToFit sizeWithFont: [UIFont boldSystemFontOfSize: 12.0f] constrainedToSize: CGSizeMake(320, 800)];

    if (shouldDisplayExtra) 
        kExtraCellType cellType = [self cellIsGoingToContainExtraView];
        if (cellType != kExtraCellTypeNone) 
            [cellsToContainExtra setValue: [NSNumber numberWithInt: cellType] forKey: lineIDString];
            return lineSize.height + actorSize.height + 200;
        
     else 
        // Return the line height, actor height, plus a buffer.
        return lineSize.height + actorSize.height;
    

【问题讨论】:

代码看起来很可疑:kExtraCellType 看起来像一个常量,而不是一个类型。 [self cellIsGoingToContainExtraView] 看起来返回一个 BOOL,而不是 kExtraCellType。如果没有识别单元格的参数,它如何计算任何有意义的东西?你应该回顾一下 Cocoa 编码风格的约定。 看看我的回答也许有帮助***.com/a/39275095/1470374 【参考方案1】:

返回零;为我工作。

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section

if(tableViewObj == tableView) //here u can make decision


UIView *footerView=[[UIView alloc]initWithFrame:CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y, 320, 40)];

    UIButton *addcharity=[UIButton buttonWithType:UIButtonTypeCustom];

    [addcharity setTitle:@"Help" forState:UIControlStateNormal];
    [addcharity addTarget:self action:@selector(addCharity:) forControlEvents:UIControlEventTouchUpInside];

    [addcharity setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];


    addcharity.frame=CGRectMake(0, 0, 130, 30); //set some large width to ur title

    [footerView addSubview:addcharity];

    return footerView;


return nil;

我希望它可以帮助某人......

【讨论】:

【参考方案2】:

朋友就是这么简单, 如果我们声明 int 类型的函数,并且在 if,for..etc 语句中我们返回一个值,那么它会显示这个警告 bcz 如果不满足上述任何条件,那么它将返回什么,所以我们应该返回一个任何值结尾或在 else 块中。

【讨论】:

【参考方案3】:

您确实有一个导致无法返回的条件:

如果shouldDisplayExtra 存在且cellType == kExtraCellTypeNone 则没有定义返回...

你应该在条件中添加一个 else 块:

    if (cellType != kExtraCellTypeNone) 
        [cellsToContainExtra setValue: [NSNumber numberWithInt: cellType] forKey: lineIDString];
        return lineSize.height + actorSize.height + 200;
     else 
       // return something here
    

【讨论】:

【参考方案4】:

编译器会这样处理,因为“main”块中没有返回语句。

尝试这样做,警告就会消失:

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath

    NSString *lineToFit = [[self.fetchedResultsController objectAtIndexPath: indexPath] line];
    NSString *actorToFit = [[self.fetchedResultsController objectAtIndexPath: indexPath] actor];
    CGSize lineSize = [lineToFit sizeWithFont: [UIFont boldSystemFontOfSize: 12.0f] constrainedToSize: CGSizeMake(320, 800)];
    CGSize actorSize = [actorToFit sizeWithFont: [UIFont boldSystemFontOfSize: 12.0f] constrainedToSize: CGSizeMake(320, 800)];

    if (shouldDisplayExtra) 
        kExtraCellType cellType = [self cellIsGoingToContainExtraView];
        if (cellType != kExtraCellTypeNone) 
            [cellsToContainExtra setValue: [NSNumber numberWithInt: cellType] forKey: lineIDString];
            return lineSize.height + actorSize.height + 200;
        
    
        // Return the line height, actor height, plus a buffer.
        return lineSize.height + actorSize.height;

它将具有您想要的行为,并且没有警告。

【讨论】:

嗯,我已经这样做了(如前所述),但我很好奇为什么编译器无法解决它不会卡住:)

以上是关于Xcode 认为由于 if/else 语句中的返回,控制可能会到达非 void 函数的末尾的主要内容,如果未能解决你的问题,请参考以下文章

使用jquery中的if else语句获取返回真值

指针在if / else语句之前有地址但是立即变为0x0

C语言中的条件赋值语句和if——else语句执行效率比较,哪一个效率高些,坐等高手解惑

用于计算的 R 中的 if else 语句

带有布尔条件的 if else 语句中的代码[重复]

在 NSDictionary 中查询 if/else 语句中的值