2012-03-19 4 views
0

제 UITableView의 경우 배열을 데이터 소스로 사용합니다. 지금까지 모든 것이 잘 작동합니다. 그러나 검색 필드를 사용하여 몇 개의 문자를 입력하면 (나중에 다시 삭제할 때) 기본 배열이 갑자기 비어있는 이상한 문제가 발생합니다. 내하는 .m 코드 내 .H배열이 갑자기 비어 있습니다.

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

} 

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

사용에

선언 : 여기에 관련이있을 수있는 코드 조각은 내 문제를 이해하는

@synthesize cardArray; 
... 

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

을 나는 데이터 배열을 채 웁니다 내 SQL DB에서 :

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

그리고 코드 내에서 cellForRow meth와 같은 배열 내용을 읽습니다. 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 UR 전체하는 .m 파일 가고 .. –

+1

는 메소드'이다 self.cardArray removeAllObjects]; self.cardArray = nil;'? 아마도 그 방법을 더 게시해야합니다. 릴리스 명령에 문제가 있으면 빨간색 플래그가 표시됩니다. 'removeAllObjects' 호출은 필요 없습니다. 배열 속성을 nil로 설정하면 모든 객체에 릴리스가 전송됩니다. 그래서 당신이'removeAllObjects'를 호출해야한다면 다른 이슈를 마스킹합니다. – SSteve

답변

0

오케이, 마침내 범인을 발견했습니다. [myArray release] (아래 주석 행 참조)였습니다. 나는 단서가 없다. 왜 그래. 이것은 로컬 배열이며, 로컬로 정의하고 immediatly로 다시 릴리스 할 수 있어야합니다. 흥미로운 부분은 검색이 좁아지는 한이 코드가 작동한다는 것입니다. 검색 필드가 다시 비어있는 경우에만 충돌합니다. 매우 혼란 스럽지만 어쩌면 누군가가 설명을합니까 ?? 여하튼, 마침내 그것을 얻었고, 예상했던 것에 따라 ru.

- (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; 
} 
관련 문제