2009-09-27 8 views
1

다음 코드에서보기 컨트롤러의 속성 인 NSMutableArray 'categories'의 값으로 표보기 셀 텍스트를 설정합니다. 그건 잘 작동합니다.IPhone - 배열, 이중 표준에서 NSString 설정!

그러나 다른 메서드에서 똑같은 코드를 시도하면 오류 또는 경고없이 컴파일됩니다.

NSString *categoryName = [categories objectAtIndex:indexPath.row]; 

NSString *categoryName = [[NSString alloc] initWithString:@"test"]; 

의미가 있습니다 ... 어떤 아이디어에 : 나는 didSelectRowAtIndexPath 방법에 다음 줄을 변경하는 경우?

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

// Configure the cell. 
NSString *categoryName = [categories objectAtIndex:indexPath.row]; 
cell.textLabel.text = categoryName; 

    return cell; 
} 




// Override to support row selection in the table view. 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    printf("User selected row %d\n", [indexPath row] + 1); 

ButtonsPageViewController *bView = [ButtonsPageViewController alloc]; 
NSLog(@"created instance of buttonspageviewcontroller"); 

NSString *categoryName = [categories objectAtIndex:indexPath.row]; 
NSLog(@"category name set"); 

bView.selectedCategory = categoryName; 
NSLog(@"selected category property set"); 

[self.navigationController pushViewController:bView animated:YES]; 
NSLog(@"push view controller"); 

[bView release]; 
} 
+0

크래시가 무슨 말을합니까? 크래시가 발생했을 때 콘솔에서 '백 트레이스'를 말하고 그 질문에 붙여 넣으면 도움이됩니다. – Surya

+0

그리고 무엇이 *'[categories objectAtIndex : indexPath.row]'입니까? 디버거에서 이것을 보셨습니까? 아니면 그냥 NSLog 디버깅? – Chuck

답변

2

NSString *categoryName = [categories objectAtIndex:indexPath.row]; 

NSString *categoryName = [[NSString alloc] initWithString:@"test"]; 

의 차이는 그 개체에 대한 첫 번째 줄에 복사 (포인터 변경되지 않는 계수를 유지하는) 두 번째 새를 생성하는 반면 개체 (보유 카운트 = 1).

에서 text 속성을 설정하면 문자열을 복사하거나 유지하므로 문제가 없습니다. didSelectRowAtIndexPath에서 ButtonsPageViewController의 속성을 설정하고 있습니다.이 코드는 사용자 자신의 코드라고 가정하고 있지만 개체를 ​​복사하거나 유지하지는 않습니다.

ButtonsPageViewController *bView = [ButtonsPageViewController alloc]; 

또한

라인은 문제를 야기 할 것이다. 개체를 올바르게 초기화하려면 init으로 전화해야합니다. 이 행에서 수행 한 작업은 메모리를 할당하는 것입니다.

일반적으로 메모리 관리 유지/해제를 브러시로 처리해야하는 것처럼 보입니다. 그러면 문제가 생길 것입니다.

+0

필자는 전에 bView를 올바르게 초기화 했으므로 초기화했습니다. 나는 동의한다, 나는 기억 관리를 닦을 필요가있다! –

+0

나는 그것을 얻었다! 당신은 메모리 관리에 대해 옳았습니다. 나는 category 배열을 유지했고 지금은 작동 중이다. 친애하는 친구를 도와 주셔서 감사합니다! 당신에 대한 찬사 : D –

1

benzado와 마찬가지로 selectedCategory 값이 ButtonsPageViewController 인 문제가 있습니다.

@property@synthesize을 사용하고 있습니까? 아니면 직접 액세서리를 쓰고 있습니까? 이전의 경우 속성 선언 특성을 살펴 봐야합니다. 그렇지 않으면 사용자 지정 접근 자에서 retain/release 것입니다.

The Objective-C 2.0 Programming LaungaugeDeclared Properties 섹션은 합성 된 접근 자 선언 규칙에 유용한 리소스입니다.