【问题标题】:"Return;" a parent method in the stack-trace“返回;”堆栈跟踪中的父方法
【发布时间】:2017-05-30 17:39:21
【问题描述】:

在objective-c(运行linux)中,假设我有一个方法-A,它调用一个方法-B,在方法-B内部我调用return;

a {
    //stuff
    [self b];
    //stuff
}

b {
    //stuff
    return;
    //stuff
}

当我在方法 B 中调用 return 时,它仍会完成方法“A”(父方法)的其余部分。但是,如果我需要返回调用方法 B 的方法(父方法,方法 A)怎么办。

Objective-C 有 superReturn;returnAll; 类型的函数吗?现在,我只是设置在方法-B 内部调用完方法-A 后检查的 BOOL。

我假设有一些方法可以直接使用 linux 命令 访问堆栈跟踪并全部返回。也许一些线程命令也存在,只是为了return;ing 当前线程。

【问题讨论】:

  • 好吧,我要说“不,你不能。”我还会说“不,你不应该”。这意味着......好吧,如果你真的非常想......搜索using exceptions for flow control并了解为什么这是一个坏主意,一种方法:)
  • 我不明白为什么使用return; 是个好主意,但对父方法执行相同的操作是个坏主意。我也会调查一下,谢谢!
  • 我同意 DonMag 的观点,通常做这种流量控制是一个坏主意(从两种方法返回。)如果你找不到解决问题的另一种方法,我建议你扩展细节为什么你想要这样的东西。方法 A 有什么作用?方法-B 是做什么的?您要实现的总体要求是什么?因为“superReturn”的东西看起来很像一个 XY 问题。
  • 方法 B 规定在其他可能调用它的方法中应该发生什么是一个非常糟糕的主意。如果你用一个更具体的例子来更新你的问题,这可能会有所帮助。可能有一个适当的解决方案,但您的问题过于关注特定的解决方案,而不是关注更普遍的问题。见XY Problem
  • @rmaddy 对于我的一个具体示例,我已经有了一个实用的解决方案,如果我想返回第二种方法,我只返回一个 BOOL。我只是想知道是否存在这样的超级返回命令。

标签: ios objective-c linux multithreading methods


【解决方案1】:

块解决方案

考虑到不存在内置的superReturn;,块可能是根据需要控制此流且没有负面影响的好方法。

-(void)viewDidLoad {
    [self methodA];
}

-(void)methodA {
    NSLog(@"1");
    NSLog(@"2");
    __block BOOL superReturn;
    [self methodB:^(NSNumber * _Nullable shouldSuperReturn) {
        if (shouldSuperReturn) {
            superReturn = [shouldSuperReturn boolValue];
        }
    }];
    if (superReturn) {
        return;
    }
    NSLog(@"3");
    NSLog(@"4");
}

-(void)methodB:(void(^)(NSNumber * _Nullable shouldSuperReturn))superReturn; {
    NSLog(@"a");
    NSLog(@"b");
    superReturn(@(YES));
    return;
    NSLog(@"c");
    NSLog(@"d");
}

//Logs 1,2,a,b.

注意:带有 NSNumber 类型的 Nullable 标志是可选的。这可以通过 BOOL 来完成,因为如果无法通过块传回值将导致 NO 无论如何。

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 2012-06-19
    • 2018-07-02
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多