2009-11-24 3 views
0

Java 및 C++ 개발 경험이 많아서 클래스 및 추상화 데이터가 꽤 쉽습니다. 저는 짧은 시간 전에 객관식 C를 시작했고, 저는 대부분 세계 전역에서 일하는 중이었고 모든 것이 순조롭게 진행되었습니다. 필자는 스파게티 코드를 줄이기 위해 코드의 상당 부분을 추출하기로 결정했으며, 토요일 이후로 극복하지 못했던 문제를 짚었습니다.Objective-C, 클래스 추상화 및 해당 변수 액세스

개요 :

내가 재생 카드 게임을하고있다. 나는 최근 카드 데이터를 3 개의 변수를 포함하는 클래스로 추상화했다. (정수) i_cardValue, (int) i_cardSuit 및 (UIImage *) uii_cardImage. 나는 또한 엔진 부품 (예 : 셔플 갑판 Managment를 같은 기본적으로 갑판 기능을) 추상화

-(PlayingCard *)initWithValue:(int)i_initValue suit:(int)i_initSuit image:(UIIMage*)uii_initImage { 

    [self setCardValue:i_initValue]; 

    [self setCardSuit:i_initSuit]; 

    [self setCardImage:i_initImage]; 

    return self; 

} 

를 호출하여 카드를 만들 수 있습니다. 데크는 가변 배열이고 init 데크 기능을 가지고 있습니다.

NSMutableArray *nsma_deck; 
-(void)initDeck { 
    nsma_deck = [[NSMutableArray alloc] initWithCapacity:52]; 
} 

이제 내보기 컨트롤러에, 내가 initDeck로 전화를 걸, 그럼 내가 같은

[pce_Engine initDeck]; 
[[pce_Engine nsma_deck] addObject:[[PlayingCard alloc] initWithValue:13 suit:2 image:[UIImage imageNamed:@"2C.png"]]]; 

pce_Engine 유형의 PlayingCardEngine의 변수 인 선으로 갑판에 항목을 추가 할 수 있습니다. NSLog 줄을 initDeck에 넣었고 프로그램을 실행할 때 콘솔에 표시되지 않습니다. 그들은 호출되지 않습니다, 그래서 배열을 할당 점점, 그리고 그래서 내가 배열에 물건을 추가 할 수 없어? 나는이 모든 일을 잘했다고 생각했지만, 그것을 잘못했거나 무언가를 빠뜨린 것 중 하나는 뷰에 추가하는 것이 표시되지 않기 때문입니다. NSLog를 사용하여 갑판 == nil, 그래서 문제는 내가 갑판에 올바르게 액세스하지 못하고 값을 추가하지 않고 빈 변수 만 사방에 가지고 있다는 것입니다. (객관적인 C에 대한 많은 자습서를 보았습니다. 그러나 나는 심지어 내가 갈거야으로까지 추상화를 발견하지 않았습니다, 그래서 나는 내 문제를 찾을 수 없어.

사람이 올바른 방향으로 날 포인트?

답변

0

우선, Eimantas에 따르면 init 메소드가 [super init]에 대한 호출을 빠뜨린 것에 동의합니다.이 값은 정상적인 init 메소드가 어떻게 생겼는지에 대해 반환해야합니다.

init_deck의 경우 -보기 컨트롤러의 어떤 메소드에 두 줄이 있습니까? 나는 호출 코드가 다른 것보다 더 많이 호출되지 않는다고 생각하고있다. (pce_Engine은 코드가 호출 될 때 nil이 될 수도 있지만 어떤 경우에는 작동하지 않을 수도있다).

+0

mg, pce_Engine을 잡아 주어서 고맙습니다. 초기화되지 않았습니다. 한 줄의 코드와 모든 것이 효과가 있다고 덧붙였습니다 (^. ^). 질문에 대답하기 위해 init_deck은 viewDidLoad 메서드에 있었고 새로운 엔진을 만들지 않았기 때문에 inits를 호출하지 못했습니다. – ColdLogic

3

을 내가 카드를 추정 클래스가 NSObject의 하위 클래스 인 경우 지정된 초기화 도구 (init)를 구현하여 [super init]을 호출하고 일반 설정을 수행해야합니다. 그리고 initWith ... 메서드에서 [self init]을 호출 한 다음 할당을 수행해야합니다.

http://mikeash.com/?page=pyblog/the-how-and-why-of-cocoa-initializers.html

같은 갑판 관리를위한 클래스로 간다 :

여기에 코코아/목표 - C 이니셜 라이저에 대한 좋은 게시물입니다. 희망이 당신의 문제를 찾는 데 도움이됩니다.

+0

링크를위한 thx, 나는 inits가 틀린/진짜로 inits다는 것을 알고있다, 나는이 didnt 일 및 나가 [슈퍼 init] 및 [self init] s가 있던 방법에 압박하고 있었다, 나는 많은 부호 문제를 해결하기위한 노력의 일환으로 이와 같이 보입니다. <. <. – ColdLogic