Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
Iphone NSArray内存管理问题_Iphone_Objective C_Memory Management_Nsarray - Fatal编程技术网

Iphone NSArray内存管理问题

Iphone NSArray内存管理问题,iphone,objective-c,memory-management,nsarray,Iphone,Objective C,Memory Management,Nsarray,以下是我在后台线程中运行的代码: -(void)updateFAQCache { NSAutoreleasePool *objPool = [[NSAutoreleasePool alloc] init]; // Grab the new plist NSMutableArray *arrLoadedData = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://my

以下是我在后台线程中运行的代码:

-(void)updateFAQCache {

    NSAutoreleasePool *objPool = [[NSAutoreleasePool alloc] init];

    // Grab the new plist
    NSMutableArray *arrLoadedData = [[NSMutableArray alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://myurl.com/"]];

    // If the data is not Nil, update the table view and cache with the new data
    if (arrLoadedData != Nil) {

        // Merge the new data into our IVar
        arrFAQData = arrLoadedData;

        // Update the table view
        [self performSelectorOnMainThread:@selector(refreshFAQTable) withObject:Nil waitUntilDone:NO];

        // Save the new data to the cache
        [arrFAQData writeToFile:self.strFAQCacheLocation atomically:YES];

    }

    [arrLoadedData release];

    [objPool release];

}
我的问题是,在发布
arrloadedata
时,似乎正在发布
arrFAQData
的内容。这对我来说是有意义的,但我需要弄清楚如何将这些数据保留到IVAR中,同时允许我释放局部变量,
arrloaddedata


谢谢你的帮助

在代码中,
arrFAQData
只是
arrloadedata
的别名,因此底层对象将“同时”释放(它是同一个对象)。您需要保留对
arrloadedata
的引用,并存储该引用

arrFAQData = [arrLoadedData retain];

arrafaqdata
定义为带有
retain
关键字的属性,然后按如下方式分配:

self.arrFAQData = arrLoadedData;
这将
在您的.h文件中保留分配时的
ArrloadeData

@private
NSArray *_arrFAQData;

@property (nonatomic, retain) NSArray *arrFAQData;
在.m文件中:

@synthesize arrFAQData = _arrFAQData;
然后在updateFAQCache方法中:

self.arrFAQData = arrLoadedData;
[arrLoadedData release];
不要忘记在
dealloc
方法中添加以下内容:

[_arrFAQData release];

除了上面的回复之外,像这样从辅助线程设置数据是不安全的。主要的风险是,当值突然改变时,主线程中的某些内容将部分通过使用旧数据值执行某些操作。绝对最坏的情况是在主线程的中间部分:

for(id object in arrFAQData)
{
    ... something ...
}
如果您释放了arrFAQData指向的内容,并将其他内容放在辅助线程中,那么您最终将尝试访问解除分配的内存。同样,您也不能将arrFAQData保持为同一逻辑数组,而只是将新对象复制到其中,因为在快速迭代时可能不会修改数组

并行性是一个非常复杂的主题,无法深入探讨,但作为一个快速解决方案,我建议将refreshFAQTable切换到一个以新数组为参数的方法,并将代码更改为:

[self performSelectorOnMainThread:@selector(refreshFAQTable:) withObject:arrLoadedData waitUntilDone:YES];

这显然可以避免在更换阵列的同时在阵列上运行的主线程出现任何问题。

Ups,没有看到您释放arrLoadedData。所以,放弃我回答中的那一行,这是一个很好的观点。你有什么关于并行性的好文档可以让我阅读吗?