Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c缺失块类型说明符_Objective C_Xcode_Nsstring - Fatal编程技术网

Objective c 目标c缺失块类型说明符

Objective c 目标c缺失块类型说明符,objective-c,xcode,nsstring,Objective C,Xcode,Nsstring,新的目标c在这里。。。我试图初始化2个字符串,稍后再进行设置,但r1和r2出现以下错误: the variable is not assignable (missing _block type specifier) 我的代码如下所示: NSMutableString *r1 = [NSMutableString stringWithFormat:@"None"]; NSMutableString *r2 = [NSMutableString stringWithFormat:@

新的目标c在这里。。。我试图初始化2个字符串,稍后再进行设置,但r1和r2出现以下错误:

the variable is not assignable (missing _block type specifier)
我的代码如下所示:

    NSMutableString *r1 = [NSMutableString stringWithFormat:@"None"];
    NSMutableString *r2 = [NSMutableString stringWithFormat:@"None"];
    NSURLRequest *request = [client URLRequestWithMethod:@"GET" URL:statusesShowEndpoint parameters:params error:&clientError];

if (request) {
    [client sendTwitterRequest:request completion:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if (data) {
            // handle the response data e.g.
            NSError *jsonError;
            NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
            NSLog(@"ok!");
            for(NSString *key in [json allKeys]) {
                NSLog(@"%@",key);
            }
            r1 = json[@"statuses"][0][@"text"];
            r2 = json[@"statuses"][1][@"text"];
我不知道这是否是设置字符串的正确方法。。。。
就像我想做的一样,我只想初始化一个字符串并在以后设置它。

您对两个字符串变量的赋值在传递给sendTwitterRequest:completion:的块中。默认情况下,块捕获它在块外部声明的任何局部变量的值,在r1和r2的情况下,它不捕获变量本身,这意味着它不能更改存储在这些变量中的值。请注意,如果捕获的值是对可变对象的引用,那么在您的情况下,这些值是对可变字符串的引用,那么您可以对对象进行变异,这样做不会改变引用本身

您可以通过两种方式修复代码:

1我认为您试图分配的值是对不可变字符串NSString*的引用,因此我怀疑您只是将这两个变量声明为NSMutableString*以试图解决您的问题

要允许对捕获的局部变量进行赋值,必须使用_块对局部变量声明进行注释,这将更改捕获行为,以便捕获变量,而不是其值。要走这条路,您只需将声明更改为:

__block NSString *r1;
__block NSString *r2;
不需要给变量一个初始值,它们将自动具有值nil。你的区块现在可以直接分配给r1和r2,但是请看下面的大图标

2如果您确实需要可变字符串NSMutableString*,那么您的两个声明就可以了,问题是您使用变量r1和r2的赋值,而不是对它们引用的字符串进行变异。可以使用setString:更改可变字符串的值。要执行此操作,请将两项作业替换为:

[r1 setString:json[@"statuses"][0][@"text"]];
[r2 setString:json[@"statuses"][1][@"text"]];
这两个变量将改变变量引用的字符串,这些更改将通过r1和r2中存储的引用在块外部可见。然而,与上面的第一种方法一样,请参见以下大但

大但是

您提供的代码片段表明您可能还存在一个常见错误:假设在调用获取块后,在用作异步处理程序的块中分配的值将可见,在您的示例中,sendTwitterRequest:completion:。这通常不是真的,对sendTwitterRequest:completion:的调用在完成块运行之前返回-这是异步方法的全部要点,例如sendTwitterRequest:completion:;他们将您的案例中的工作AccessingWitter安排为在后台并发运行,然后返回,稍后当异步工作完成时,将调用完成块

如果你犯了这个错误,你需要阅读异步设计,如果你愿意,你可以使用苹果的文档,你也可以在上面搜索——关于这个主题有很多问答。完成后,您可以重新设计代码,如果您在这一点上有问题,请提出新问题


HTH

您的错误表明您包含的代码没有包含足够的上下文,人们无法验证您的问题。那两份作业具体在哪里?编辑您的问题以提供更多的上下文,这样人们可以更好地帮助您。不清楚,缺少信息,但如果我是来猜的,我会说您有一个带块的NSURLSession异步调用,您希望在r1和r2中检索一些值,它们在块之前声明,因此您需要执行u block NSString*r1。请看这里:另外,您定义它的方式是可变的,但我强烈认为json[@statuses][0][@text]并不是真正可变的,它是一个NSString而不是一个NSMutableString。请阅读以下内容:它解决了我遇到的错误。。。但是当我将label.text设置为r1或r2时,我得到了none或null。这是否意味着我必须将NSMutableString更改为NSString?我怀疑这意味着您已经与big发生冲突,并且正在异步块写入变量之前读取该变量。感谢您的帮助和澄清:-这对我帮助很大