2010-03-15 5 views
1

그래서 두 번째 질문은이 응용 프로그램을 기반으로하고 있으며 Objective C를 가르치고 있습니다. 나는 그것을 만드는 곳 그래서 그건클래스 사이에 NSArray 전달

@interface MainViewDataSource : NSObject { 
    NSArray *listNames; 
} 

@property (nonatomic, retain) NSArray *listNames; 
-(NSArray *)getListNames; 

다음과 같이

- (id) init 
{ 
    if (self = [super init]){ 
    listNames = [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", 
        @"Video",@"Library",@"Funeral", nil]; 
    NSLog(@"%@",listNames); 
    } 
    return self; 
} 

.H 보이는 : 나는 지금 대부분처럼 보이는 데이터 소스 클래스를 가지고있다. 이제 문제는 배열 listNames를 가져 오려고하면 아무 것도 반환하지 않는다는 것입니다.

다음 조각 :

NSArray* data = [listData listNames]; 

는 데이터 listNames의 정보를 넣어 가정,하지만 ... 아닙니다. 이후 JAva에 익숙해 졌기 때문에, 어떻게 수정 해야할지 모르겠다는 목표 C 버크가 맞을 것입니다. 그래서 내가 도움을 청하기 위해 여기에있을거야. NSArrays를 이와 같이 전달하는 적절한 방법은 무엇입니까?

답변

1

-initMainViewDataSource에 실행하고 있습니까?

MainViewDataSource *_source = [[MainViewDataSource alloc] init]; 
NSLog(@"listNames --> %@", [_source listNames]); 
... 
[_source release]; 

또한 -dealloc 방법은 listNames에 대한 release이 포함되어 있는지 확인하거나 메모리 누수가됩니다.

+0

아래 답변에 추가 한 것처럼 나는 그렇지 않았습니다. 이 코드를 구현하고 작동하는지 확인하겠습니다. – Althane

+0

'MainViewDataSource * _sourceObjC = [[MainViewDataSource alloc] init]'은 Java에서'MainViewDataSource _sourceJava = new MainViewDataSource()'와 동일하다고 생각할 수 있습니다. 당신의'_sourceObjC'가 앞으로 언젠가 릴리스 될 필요가 있다는 것을 제외하고는. –

+0

좋습니다. 이것이 하나의 문제로, 이제는 다른 코드가이 코드가 작동하기 시작한 후에 어떤 문제가 발생했는지 확인할 수 있습니다. 감사. – Althane

0

getter의 구현을 만들어야합니다. 컴파일러는 @synthesize를 사용하여이를 수행 할 수 있습니다.

@synthesize listNames; 

getter 메서드를 선언 할 필요가 없습니다.

+0

완료. 아직도 그러나 작동하지 않습니다. 또한 주 델리게이트의 listData 클래스를 합성합니다. @synthesize listData; listData의 "init"함수를 호출해야합니까? 맞습니까? init 이래로 listNames에 데이터를 삽입합니다. – Althane

+0

초기화는 합성 된 getter/setter 함수에 의해 호출되지 않습니다. 클래스를 할당하는 코드는 init 함수를 호출해야합니다. 실행했을 때 init의 NSLog 출력을 보았습니까? – progrmr

+0

아니요.하지만 전에 NSLog가 콘솔에서 먹어 버린 문제가 있었으므로 확실하지 않았습니다. 그래서, 대신 listData에 대한 합성, 나는 "listData = [MainViewDataSource 초기화]"라고해야합니까? – Althane

0

코드를 모두 보지 않고도 다른 클래스에 배열을 유지해야 할 수도 있습니다. 다른 클래스 객체를 사용하는 경우 MainViewDataSource 객체와 함께 출시되지 않도록 유지해야합니다. 시도해보십시오 ...

NSArray* data = [[listData listNames] retain]; 

그런 다음 배열을 인쇄 할 수 있는지 확인하십시오.

0

listData를 초기화하지 않았을 것입니다. 당신은 ALLOC 그것은 다음과 같이 init을 할 수 있습니다

MainViewDataSource* listData = [[MainViewDataSource alloc] init]; 

는 다음과 같은 배열에 대한 포인터를 얻을 수 있습니다 :

NSArray* data = [listData listNames]; 

또는

NSArray* data = listData.listNames; 
-1

접근 자 ... 접근 자 .. 액세서 ...

항상 사용하십시오. 예외는 없습니다 (배우기 전까지).

당신이 할 때

listNames = [[NSArray alloc] initWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil]; 

당신이 정말하고 싶은 : 직접 (자기에 대한 참조를)을 listNames를 설정하지하여

[self setListNames:[NSArray arrayWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil]; 

또는

self.listNames = [NSArray arrayWithObjects: @"Grocery", @"Wedding", @"History class",@"CS Class",@"Robotics",@"Nuclear Sciences", @"Video",@"Library",@"Funeral", nil]; 

, 당신 접근자를 사용하지 않고 누출을 제거하려고 할 때 상처를 입을 것입니다.

[self listNames]; 

또는

self.listNames; 

다시, 접근을 사용하지 유혹을 피하기 : 목록에 도착하려면 접근을 사용합니다.

+1

애플은 접근자를 사용하지 말 것을 권한다. 당신의'init'과'dealloc' 메소드 내에서 메소드를 호출 할 수 있습니다. 참조 : http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html – dreamlax

+0

특정 발췌 : * 인스턴스 변수를 설정하기 위해 접근 자 메서드를 사용하면 안되는 유일한 곳 'init' 메쏘드와'dealloc'에있다. * – dreamlax

+0

내가 말했듯이, 당신이 그들을 사용하지 않을 때까지는 배울 때까지. KVO/KVC와의 상호 작용이 가능할 수도 있습니다 (거의 비슷합니다). 그러나 항상 그렇기 때문에 관측자가 무 사건을 처리 할 수 ​​있도록 설계하는 것이 문제가되지 않습니다. 이 가이드 라인은 간단히 가이드 라인입니다. 실제로는 init 코드와 dealloc 코드 둘 다에서 접근자를 사용하면 훨씬 간단한 코드를 얻을 수 있습니다. 물론, 그것은 모든 옵서버에게 올바른 방어 프로그래밍을하는 것에 달려 있습니다. –