2016-08-16 84 views
-3

这个函数在Objective-C中返回什么?函数或方法什么时候会停止执行?

- (NSInteger)test1 { 
    @try { 
     return 1; 
    } @catch (NSException *exception) { 
     return 2; 
    } @finally { 
     return 3; 
    } 
    return 4; 
} 

而当将一个函数或方法停止执行?(不仅是Objective-C代码)

------------更新----- ---------

结果是3

如果我评论或删除返回代码在最后,会出现什么功能输出?

- (NSInteger)test2 { 
    @try { 
     return 1; 
    } @catch (NSException *exception) { 
     return 2; 
    } @finally { 
     //return 3; 
    } 
    return 4; 
} 

结果为1

我问这个问题是要知道什么时候会在功能停止执行。

+0

但是,你甚至不会告诉我们它写了什么语言(看起来像Objective-C?) – tambre

+0

是的,它是Objective-C。但在java中结果相同。 – Simon

+1

我不明白这个问题。您可以编译并运行该代码(使用合适的样板)并亲自查看。 – Avi

回答

1

它,当它到达的代码路径的最后一行,所以它的理解代码路径中的所有问题停止执行。

一般规则:

  • 代码在其出现的顺序执行。
  • 在函数返回给调用者之前,finally代码块中的代码将运行。
  • 要执行的最后一个返回语句的值将是函数的返回值。

现在,让我们将这些规则应用于您的示例。

- (NSInteger)test1 { 
    @try { 
     return 1; 
    } @catch (NSException *exception) { 
     return 2; 
    } @finally { 
     return 3; 
    } 
    return 4; 
} 

要执行的第一条语句是return 1;。它在@try块中实际上是不相关的,因为它不会引发异常。因为它是一个返回语句,函数即将返回。但是,有一个@finally块,以便下一步执行。唯一的语句是return 3;,以便执行并替换由前面的语句设置的函数的返回值。

如果从@finally块删除代码,或完全消除块,代码执行的第一条语句后只是简单地返回,因为它是一个return声明。

return语句总是使函数的执行短路,并导致执行任何清理代码(例如,在ObjC中为@finally块,在Swift中为defer块)。

+0

谢谢,你说得更清楚。 – Simon

0

我想你的code.I叫你在viewDidLoad方法

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    NSInteger i = [self test]; 
    NSLog(@"The value is - %ld",(long)i); 
} 


- (NSInteger)test { 
@try 
{ 
    return 1; 
    } @catch (NSException *exception) { 
    return 2; 
    } @finally { 
    return 3; 
    } 
    return 4; 
} 

编码并印刷

The value is - 3 

其实首先它会调用try块,然后调用finally块。

@try - 定义的代码块是一个异常处理域: 代码,可以潜在地抛出异常。

@catch() - 定义一个包含用于处理抛出在@try块中的异常 的代码的块。 @catch的参数是本地抛出的异常 对象;这通常是一个NSException对象,但可以是其他类型的对象,例如NSString对象。

@finally - 定义一个相关代码块,随后执行 是否抛出异常。 finally块包含无论是否抛出异常都必须执行的代码。

@throw - 引发异常;此指令在 行为与NSException的raise方法几乎完全相同。您通常会抛出 NSException对象,但不限于它们。有关@throw的更多信息 ,请参见抛出异常。

Handling Exception

+0

谢谢,但这不是我想要的答案。 – Simon

+0

那你还想要什么哥哥? – user3182143

+0

兄弟如果你不打电话最后它返回1兄弟 – user3182143