代码之家  ›  专栏  ›  技术社区  ›  iupchris10

在iOS后台线程中使用autorelease变量

  •  0
  • iupchris10  · 技术社区  · 11 年前

    在一个iOS应用程序中,我启动了几个后台线程来处理从REST服务返回的一些XML。

    我有一些用户在PeopleParser.m中的[self.names-addObject:name]代码行遇到间歇性崩溃。崩溃日志没有显示原因,只显示了崩溃的代码行。我无法再现崩溃,所以我认为这与记忆有关。在我的for循环完成之前,我的*xml对象是否可能被释放,可能是由主线程池释放的?请注意,我并没有在后台线程中声明自动释放池。

    抓取器.m

    -(void) peopleFetchComplete:(ASIHTTPRequest *)theRequest {
    
        dispatch_async( backgroundQueue, ^{
           PeopleParser *xmlParse = [[PeopleParser alloc] initWithContext:[self managedObjectContext]];
           [xmlParse parseXMLData:[theRequest responseData] parseError:&parseError];
           [xmlParse release];
        });
    }
    

    人员分析程序.h

    @interface PeopleParser : NSObject {
        NSMutableArray *names;
        ...
    }
    
    -(void)parseXMLData:(NSData *)data parseError:(NSError **)error;
    
    @property (retain, nonatomic) NSMutableArray *names;
    

    人员分析程序.m

    -(id)initWithContext:(NSManagedObjectContext *)managedObjContext{
        self = [super init];
        self.managedObjectContext = managedObjContext;
        names = [[NSMutableArray alloc] init];
        return self;
    }
    
    -(void)dealloc{
        [names release];
        [managedObjectContext release];
    }
    
    @synthesize names;
    
    -(void)parseXMLData {
    
        //documentWithData returns an autorelease object
        SMXMLDocument *xml = [SMXMLDocument documentWithData:someNSData error:nil];
        NSArray *people = [[document root] children];
    
        for (SMXMLElement *element in people) {
            NSString *name = [element attributeNamed:@"personName"];
            [self.names addObject: name];  //CRASHES HERE occasionally 
        }
    
        //do additional stuff with the data
        ...
    }
    

    故障日志

    异常类型:EXC_CRASH(SIGABRT) 异常代码:0x000000000000000、0x0000000000000000 断线:7

    上次异常回溯:

    0核心基础0x3465229e __exception预处理+158

    1 libobjc.A.dylib 0x3c37a97a objc_exception_show+26

    2 CoreFoundation 0x3459c8d4-[__NSArrayM插入对象:atIndex:]+764

    3 MyApp 0x000fee36-[PeopleParser parseXMLData:parseError:](PeopleParser.m:62)

    4 MyApp 0x000e9b4c __50-[取数人取数完成:]_block_invoke(取数器.m:818)

    1 回复  |  直到 11 年前
        1
  •  1
  •   Grzegorz Krukowski    11 年前

    在执行块之前,“self.names”可能会被解除分配。 请确保取消阻止操作或保护此类不被释放(通过用加载屏幕阻止屏幕),这样用户就无法返回。

    例如,它可能发生在unloadView或类似的地方(如果你粘贴更多的代码,可能会更准确)。

    基于此,我认为异常是从insertObject方法调用的,这意味着您很可能正在尝试插入一个“nil”对象。请先尝试添加if(name){},然后再将其添加到数组中——在这种情况下,XML文件可能有问题。