2012-03-19 40 views
0

对于我的UITableView,我使用一个数组作为数据源。到目前为止一切正常。但是,我有一个奇怪的问题,那就是当我使用搜索字段并输入几个字符,然后我再次删除时,底层数组突然变空。下面的代码片段,这可能是相关的,了解我的问题:数组突然变空

宣言在我的.h

@interface dictionaryViewController : UIViewController <UITableViewDelegate>{ 
... 
... 
    NSMutableArray *cardArray; 

} 

... 
@property (retain) NSMutableArray *cardArray; 
... 

使用在我的.m代码:

@synthesize cardArray; 
... 

- (void)viewDidLoad { 
[super viewDidLoad]; 
self.cardArray = [[NSMutableArray alloc] initWithObjects:nil]; 
... 
} 

我用数据填充数组从我的SQL数据库:

  [self.cardArray addObject:[NSString stringWithFormat:@"%@ - %@", aQuestion, anAnswer]]; 

和代码内读取阵列的内容,如在cellForRow甲基OD:

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
... 
thisCardIndex = [self.cardArray indexOfObject:cellValue]; 
... 
} 

最后我释放它,像这样(其实我曾与发布命令,为什么我用了removeObjects,而不是其他一些问题):

[self.cardArray removeAllObjects]; 
    self.cardArray=nil; 

在我做日志没有看到错误。然而,调试器显示代码与SIGABRT崩溃,并且在设置断点时我看到,原因是空的cardArray。

感谢您的支持。

+2

逻辑会错somewhere..post乌尔整个的.m这里文件.. – 2012-03-19 20:03:51

+1

在该方法是'[self.cardArray removeAllObjects]; self.cardArray =无;'?也许你应该发布更多的方法。发布命令有问题应该是红旗。调用'removeAllObjects'不是必需的。将数组属性设置为nil将向所有对象发送一个版本。所以如果你不得不调用'removeAllObjects',你正在掩盖一个不同的问题。 – SSteve 2012-03-19 20:32:05

回答

0

好的,终于找到了罪魁祸首,这是[myArray发布](见下面的注释行)。我不知道,为什么。这是一个本地数组,我在本地定义,也应该能够立即释放。有趣的部分是,只要搜索范围缩小,此代码就可以工作。当搜索字段再次为空时,它只会崩溃。非常混乱,但也许有人有一个解释?无论如何,终于得到它,并如预期的那样。

- (void) searchTableView { 

NSString *searchText = searchBar.text; 
NSMutableArray *searchArray = [[NSMutableArray alloc] initWithObjects:nil]; 

for (NSDictionary *dictionary in self.listOfItems) { 
    NSArray *myArray = [dictionary objectForKey:@"Cards"]; 
    [searchArray addObjectsFromArray:myArray]; 

// [myArray release]; }

// Counter is needed to get the index of the primary key to dislpay the card in editViewController 
int aCounter=0; 
for (NSString *sTemp in searchArray) { 
    NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch]; 

    if (titleResultsRange.length > 0) { 
     [self.aCopyListOfItems addObject:sTemp]; 
     NSInteger myPrimaryKey; 
     myPrimaryKey = [[self.cardIDArray objectAtIndex:aCounter] integerValue]; 
     [self.aCopyOfCardIDArray addObject:[NSNumber numberWithUnsignedInteger: myPrimaryKey]]; 
    } 
} 

[searchArray removeAllObjects]; 
searchArray = nil; 
}