2011-10-07 7 views
3

"ClassA"와 "MethodA"클래스가 있고 "ClassB"도 있는데 "ClassB"에서 "methodA"를 호출하려고합니다. 그때 나는 ClassB가IOS : 다른 클래스의 메소드 호출

self.classA = [[ClassA alloc]init]; 

그러나이 일에있는 viewDidLoad에 쓰기 ....

@classA; 

@property(nonatomic, retain) ClassA *classA; 
//and also @synthesize... 

그때 내가

[self.classA method]; 

와 메소드를 호출하지만이 메소드를 호출하지 않는 쓰기 ClassA의 varaibles를 재설정합니다.

이 상황을 어떻게 해결할 수 있습니까?

+0

viewDidLoad 메서드에서 속성을 인스턴스화하는 이유가 무엇입니까? 일반적으로 다른 클래스 인 속성이 있으면 클래스 "init"메서드 안에서 인스턴스화합니다. 유사 - http://stackoverflow.com/questions/7639179/potential-leak-of-an-object-warning-clarification-needed/7639293#7639293 – 5StringRyan

답변

2

편집 : 원본이 잘 표현되어 있다고 생각하지 않기 때문에 답을 다시 작성하기로 결정했습니다.

Objective-C 2.0 점 표기법이 무엇인지 이해하지 못하고있는 것 같습니다. 특히 C 또는 C++로 프로그램하는 경우, 문법적으로 struct 필드 또는 class 변수 액세스 연산자와 같지만 의미 상으로 다른 프로그래밍 방식을 사용하면 혼란을 겪을 수 있습니다.

당신이 사용하는 경우 :

self.classA = newClassA; 

당신은 실제로 같은 일을하고 있습니다 :

[self setClassA: newClassA]; 

그리고 @property classAretain 속성으로 정의 할 때, 컴파일러는 같은으로 setter 메소드를 생성 :

- (void) setClassA:(ClassA *)newClassA 
{ 
    if (classA != newClassA) 
    { 
     [newClassA retain]; 
     [classA release]; 
     classA = newClassA; 
    } 
} 

코드에는 gi 벤 : 당신이 의도하지 않은

[self setClassA: method]; 

:

[self.classA method]; 

사실로 확장됩니다.

이 혼동을 피하는 가장 간단한 방법은 도트 표기법을 전혀 사용하지 않는 것입니다. 특히 변수의 할당 또는 할당 해제를 처리하는 동일한 클래스의 인스턴스 메소드 내에서는 사용하지 않는 것이 가장 좋습니다.

+0

아니요 동일한 내용 이겠지만 – CrazyDev

+0

이 경우 실행되지 않습니다. classA의 인스턴스가 nil이기 때문에 클래스 A의 메소드 – CrazyDev

+0

나는 이해하지 못한다. 예를 쓸 수 있니? – CrazyDev

1

allocA 및 init을 사용하여 ClassA의 새 인스턴스를 만듭니다. 당신이를 ClassA의 기존 인스턴스에 속성을 설정해야합니다, 더 컨텍스트없이하는 방법을 조언하기 어려운,하지만 당신은 클래스 B를 만들 때 아마,이 클래스 A를 가정

classB.classA = self; 

수행에 클래스 B를 생성 처음.

+0

잘 설명 할 수 있습니까? – CrazyDev

+1

@blackguardian, classB 인스턴스를 만드는 방법을 설명 할 수 있습니까? 012A 클래스의 – jamapag

+0

나는 # import classB를 수행합니다. @property (보유)를 한 후에 ClassB * classB; – CrazyDev

관련 문제