2011-04-13 9 views
0

다른 객체를 통해 객체의 변수에 액세스하려고하는 Objective-C에서 상황이 발생했습니다. 클래스는 (간체) :델리게이트를 통한 변수 액세스

@interface A : NSObject { 
    NSMutableArray *someStuff; 
} 

@property (nonatomic, retain) NSMutableArray *someStuff;  

@end 

오전

@implementation A 

@synthesize someStuff; 

// blah, blah, blah 

그럼, 아이폰 응용 프로그램을하고 있어요 때문에,이 오브젝트 유형의 변수를 포함하는 응용 프로그램의 대표가 :

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate> { 

    A *aPtr; 
} 

@property (nonatomic, retain) A *aPtr; 
@end 

AppDelegate.m 다른 클래스에서 다음

@implementation AppDelegate 

@synthesize aPtr; 
// blah, blah, blah 

(이 뷰 컨트롤러), 나는이 방식으로 액세스 'someStuff'에 노력하고있어 :

AViewController.m

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

NSMutableArray *someArray = appDelegate.aPtr.someStuff; 

그래서 문제는 이것이 멋지게 폭발한다는 것입니다. 나는 이것이 왜 작동하지 않는지를 이해하기에는 너무 많은 Java 중독자라고 생각합니다. 누구든지 날 풀 수 있을까?

많은 감사,

크레이그

답변

1

당신은 .....이 문제를 해결할 수

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 

NSMutableArray *someArray = appDelegate.someArray; 

이 방법으로

+0

잘못되었습니다. 캐스팅이 불필요합니다. 위의 코드가 중단되어서는 안됩니다. (깨졌을뿐만 아니라 그냥 체크 된 것입니다.) –

+0

감사합니다. 시도해 보겠습니다. – Craig

+0

좋아, 나는 그것을 시도했다. 컴파일러는 someStuff가 AppDelegate의 객체가 아니라는 것에 불평하고 있습니다 (물론 아닙니다). 컴파일러 오류는 일반적으로 someStuff가 A.의 객체가 아니라는 점입니다. – Craig

0

크레이그,

appDelegate.aPtrnull를 반환합니다. 아직 초기화되지 않았으므로 null 객체의 일부 멤버에 액세스하려고하면 (java NULLPointerException) 예상대로 동작합니다. (이는 훌륭한 방법으로 불어납니다.)

감사합니다.

0

Ravin이 맞습니다. 클래스 정의는 클래스의 iVars 및 속성을 정의하므로 A 유형의 객체를 참조하는 iVar aPtr을 정의했습니다. 그러나이 객체를 할당하고 초기화하지 않았습니다.

기본 초기화를 사용하는 예제는`aPtr = [[A alloc] init] '입니다.

+0

죄송합니다. 필자는 aPtr을 초기화했음을 밝힙니다. 내가 언급하지 않았다는 것을 고려할 때 당신의 대답은 정확합니다. 그러나 그것은 초기화되었으므로 내가 잃어버린 것이 더 있습니다. – Craig

+0

괜찮습니다.하지만 받아 들인 답은 문제를 해결하지 못합니다. 1) 캐스팅이 필요하지 않습니다. 2) iVar/속성'someArray'을 선언하지 않았습니다. 3)'aPtr '에 이르기 위해 게시 한 코드에서 다음 단계로 간다. someStuff'. 당신이 행복하다면 기쁜 일이 당신을 위해 일하고 있습니다. – XJones

0

이 ObjC에 당신이없이 전무로 메시지를 보낼 수 있기 때문에 모두가 의심스러운 소리를이를 초기화해야 문제 및 속성은 그냥 diguised 방법입니다. 예를 들어

view = nil; 
view.hidden = NO; 

등이 있으며 아무 것도하지 않습니다.

그래서 appDelegate.aPtr 이후.someStuff은

[[appDelegate aPtr] someStuff]; 

하고 [AppDelegate에 aPtr]는 아무것도하지 않고, 반환 그래서 문제없이뿐만 아니라 어떤 결과없이 [[AppDelegate에 aPtr] someStuff] 전화 안전합니다 nil을.

초기화되지 않은 객체를 사용하는 데 문제가있는 반면 (예상치 못한 객체의 지정된 생성자에서 수행해야하는 경우가 가장 많음) 예상치 못한 결과가 발생하므로 내 ObjC에서 "nil로 메시지 보내기"메시지가 울리지 않습니다. 그것은 다음 중 하나 또는 지점을 놓치고있다 다른이 문제가 아니라이 전화가 원인.

EDIT 단지 확인

: 내가 설명대로 작동하는 모든 초기화되지 않은 경우 :

A *aPtr = appDelegate.aPtr; 
NSMutableArray *someArray = aPtr.someStuff; 
NSLog(@"%@", someArray); 

또는

NSMutableArray *someArray = appDelegate.aPtr.someStuff; 
NSLog(@"%@", someArray); 

모두 : ObjC 메시지가 전무로 보낼 수 있습니다 깨지 말고 널 인쇄하지 마십시오.

A를 올바르게 초기화했지만 A에서 someStuff를 초기화하지 않으면 계속 중단되지만 N을 인쇄합니다. 문제는 aPtr을 A와 다른 클래스로 초기화하는 것일 수 있습니다.이 경우 인식기가없는 선택기 예외 (오류 로그에서 확인할 수 있어야 함)와 프로그램 충돌이 발생합니다.