【问题标题】:warning: Attempting to create USE_BLOCK_IN_FRAME variable with block that isn't in the frame警告:尝试使用不在框架中的块创建 USE_BLOCK_IN_FRAME 变量
【发布时间】:2011-04-07 22:52:29
【问题描述】:

是什么意思?尝试遍历 Cocoa obj-c 中的文件时出现此错误。

我在网上找不到任何信息。

不胜感激。谢谢。

编辑

我一直在关注本教程(link) 来预加载核心数据。我尝试过创建一个 Cococa 应用程序,也尝试过在我的 iPhone 应用程序中执行此操作。我认为我所有的核心数据设置代码都很好。每当调用此方法时,我都会得到 EXEC BAD ACCESS。

- (void)loadInitialData
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    // name ZSTREET_1   ZSTREET_2   ZCITY   ZZIP    ZURL    ZTEL    latitude    longitude

    NSString *path = [[NSBundle mainBundle] pathForResource:@"placesdata" ofType:@"txt"];

    NSString *fileString = [NSString stringWithContentsOfFile:path]; // reads file into memory as an NSString
    NSArray *lines = [fileString componentsSeparatedByString:@"\r"]; // each line, adjust character for line endings
    NSManagedObjectContext *context = [self managedObjectContext];
    for (NSString *line in lines)

    {   
        NSLog(line);

        NSString* string = [[NSString alloc] initWithUTF8String:line];
        NSArray *parts = [string componentsSeparatedByString:@"\t"];
        // value mapping
        NSString *name = [parts objectAtIndex:0];
        NSString *street_1 = [parts objectAtIndex:1];
        NSString *street_2 = [parts objectAtIndex:2];
        NSString *city = [parts objectAtIndex:3];
        NSString *zip = [parts objectAtIndex:4];
        NSString *url = [parts objectAtIndex:5];

        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        [f setNumberStyle:NSNumberFormatterDecimalStyle];

        NSNumber *latitude = [f numberFromString:[parts objectAtIndex:6]];
        NSNumber *longitude = [f numberFromString:[parts objectAtIndex:7]];
        [f release];
        // splitting the parts to create the objects

        Place *place = (Place *)[NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:context];
        Address *address = (Address *)[NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:context];
        Location *location = (Location *)[NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:context];

        // set attributes
        [place setValue:name forKey:@"name"];
        [address setValue:street_1 forKey:@"street_1"];
        [address setValue:street_2 forKey:@"street_2"];
        [address setValue:city forKey:@"city"];
        [address setValue:zip forKey:"@zip"];
        [address setValue:url forKey:@"url"];
        [location setValue:latitude forKey:@"latitude"];
        [location setValue:longitude forKey:@"longitude"];

        // link the objects together
        [place setValue:address forKey:@"address"];
        [place setValue:location forKeyPath:@"address.location"];

        [string release];
    }
    NSLog(@"Done initial load");
    NSError *error; 
    if (![context save:&error]) {
        NSLog(@"Error saving: %@", error);
    }
    [context release];
    [pool drain];


}

【问题讨论】:

  • Cocoa 还是 Cocoa Touch?我注意到您将问题标记为 [iphone]。

标签: iphone objective-c cocoa-touch


【解决方案1】:

对于其他使用完全不同的代码遇到此问题的人来说,这有点牵强附会。

警告来自调试器本身。调试器为系统中的每个对象创建一个包含信息的结构。在 EXC_BAD_ACCESS 之后,它尝试创建其中之一,但无法创建。请注意,这是一个警告而不是错误,因此在这种情况下甚至可能会出现这种情况。

无论如何,与此相关的细节无关紧要。你必须找到你的 EXC_BAD_ACCESS 的来源。一个常见的原因是在对象被释放后试图访问它。

【讨论】:

    【解决方案2】:

    对于以后遇到这种情况的人来说,我遇到了这个问题,因为我这样做太多了:

    NSString* aString = @"";
    
    for(int i=0; i<someLargeNumber; i++) {
        aString = [aString stringByAppendingFormat:@"..."];
    }
    

    一旦我切换到使用NSMutableString,问题就解决了。

    【讨论】:

      【解决方案3】:

      这一行是错误的,应该产生一个编译器警告:

      NSString* string = [[NSString alloc] initWithUTF8String:line];
      

      initWithUTF8String: 方法需要 UTF-8 编码的 C 字符串,而不是 NSString 对象。

      在继续之前,您应该修复所有编译器警告!您还应该检查parts 数组实际上是否包含您期望的尽可能多的对象。您还需要在 NSLog 中使用格式字符串,如果您的行包含任何 % 字符,您甚至可能会崩溃。

      【讨论】:

      • apski:此外,如果你已经有一个 NSString 对象,你不需要从它创建一个 NSString 对象。
      • 谢谢大家!实际上是行编码导致了问题。
      • 这对 HIS 问题来说很好,但错误是什么意思?!也就是说,我在完全不同的代码中得到了相同的错误消息。如何调试? (没有编译器警告或分析警告,而且我是一位经验丰富的 iOS 开发人员。我以前没见过这个。)谢谢!
      • 这个问题的答案如何?
      【解决方案4】:

      我碰巧经常遇到EXC_BAD_ACCESS(这不是一件好事),因为我们还没有启用 ARC。

      我找到了通过在 Zombie 模式中使用 Profiler 来追踪这些错误的最佳方法。这篇文章告诉你如何“寻找僵尸”:

      How do I set up NSZombieEnabled in Xcode 4?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        • 1970-01-01
        • 2023-03-26
        • 2022-09-23
        相关资源
        最近更新 更多