2011-01-21 29 views
0
NSArray * ComicArray = [TCSDataBase fetchManagedObjectsForEntity:@"ComicDB" withPredicate:nil]; 
    [ComicArray retain]; 

    arrayOfComics = [NSMutableArray arrayWithArray:ComicArray]; 
    [[arrayOfComics valueForKey:@"Name"] sortUsingSelector:@selector(caseInsensitiveCompare:)]; 

    [ComicArray release]; 

为什么arrayOfComics中的所有对象都超出范围?NSMutableArray使用arrayWithArray时,可变数组变成正确的大小,但对象全部超出范围

编辑:我试着这样做:

NSArray * ComicArray = [TCSDataBase fetchManagedObjectsForEntity:@"ComicDB" withPredicate:predicate]; 
    arrayOfComics =[[NSMutableArray alloc] init]; 
    for (int i = 0; i < [ComicArray count]; i++) { 
     [arrayOfComics addObject:[ComicArray objectAtIndex:i]]; 
    } 

    [[arrayOfComics valueForKey:@"Name"] sortUsingSelector:@selector(caseInsensitiveCompare:)]; 

所有arrayOfComics的对象仍然超出范围....

编辑:这工作,在arrayOfComicsTest的对象不是“出来的范围”。我不知道为什么这个工程,但当我做arrayOfComics他们超出了范围。 arrayOfComics是.h中的类变量NSMutableArray * arrayOfComics。直到这一点它才被使用。

NSMutableArray * arrayOfComicsTest = [NSMutableArray arrayWithArray:ComicArray]; 
+0

什么是“超出范围”? – BoltClock 2011-01-21 04:09:19

+2

你为什么要保留,然后释放'ComicArray`? – 2011-01-21 04:09:36

+0

另外,你为什么要创建一个NSMutableArray数组的副本,然后从该NSMutableArray创建2个后续的NSArrays? – 2011-01-21 04:09:58

回答

0

当时我遇到了一堆问题,因为我没有完全理解可变数组和非可变数组之间的区别,以及数组操作中的各种返回值。

我最终通过进行一系列更改来解决此问题。

感谢大家提供帮助。

0

为什么üR值不要使用executeFetchRequest

NSArray * ComicArray = [TCSDataBase fetchManagedObjectsForEntity:@"ComicDB" withPredicate:nil]; 
    [ComicArray retain]; 

    arrayOfComics = [NSMutableArray arrayWithArray:ComicArray]; 
    [[arrayOfComics valueForKey:@"Name"] sortedUsingSelector:@selector(caseInsensitiveCompare:)]; 
0
NSArray *comicArray = [TCSDataBase fetchManagedObjectsForEntity:@"ComicDB" withPredicate:nil]; 
NSArray *sortedComicNamesArray = [[comicArray valueForKey:@"Name"] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

注意,后者阵只有排序的漫画的名字试试这个....我仍然很老。它不包含漫画的排序列表。

顺便说一句,如果你想为你的漫画(不只是名称)排序列表,只需创建适当的谓词在-fetchManagedObjectsForEntity:withPredicate:方法中使用。

0

你必须保留你的数组“arrayOfComics”。在代码中放置一个断点,并立即创建时,所有对象都可用。但是,如果你想在其他方法中使用该数组,所有对象超出范围,因为你不保留。 否则它会将范围扩展到分配的方法。

修正后,您的代码必须是这样的:

NSArray * ComicArray = [TCSDataBase fetchManagedObjectsForEntity:@"ComicDB" withPredicate:nil]; 
[ComicArray retain]; 

arrayOfComics = [NSMutableArray arrayWithArray:ComicArray]; 
[arrayOfComics retain]; 
[[arrayOfComics valueForKey:@"Name"] sortUsingSelector:@selector(caseInsensitiveCompare:)]; 

[ComicArray release]; 

请注意,如果你要重新分配arrayOfComics,您必须释放,然后分配。

0

当你说对象“超出范围”时,我认为你的意思是你不能在调试器中看到它们。如果是这种情况,不要担心它,因为它发生了很多,它只是一个实现功能。特别是,核心数据并不总是直到需要时才获取实际对象(在“核心数据编程指南”中阅读faulting)。如果在调试器显示中右键单击阵列并选择“将描述打印到控制台”,它将非常高兴地打印数组及其所有对象。

虽然你的代码确实有问题。此行:

[[arrayOfComics valueForKey:@“Name”] sortUsingSelector:@selector(caseInsensitiveCompare :)];

是无稽之谈。首先它得到一个你的对象的名称键的数组,然后它尝试排序它(这可能会失败,除非名称数组恰好是可变的)。然后它抛弃结果。