2016-08-05 3 views
1

두 개의 objc .m 클래스가 있는데,이를 controller1.m 및 controller2.m이라고합니다.컴파일 오류를 일으키는 서로 다른 클래스에 같은 이름의 인스턴스 변수

controller1.m

@implementation controller1 
    UIAlertController *alertController; 
//more code 
@end 

controller2.m

@implementaion controller2 
    UIAlertController *alertController; 
//more code 
@end 
: controller1.m 및 controller2.m 모두에서 나는 UIAlertController의 경우, 이런 일이

프로젝트를 빌드하려고하면

오류가 발생합니다.

링커 명령은 종료 코드 1 (호출을 볼 수 -v 사용)

함께 실패와 오류 로그는 지금의 인스턴스 변수의 이름을 변경이

duplicate symbol _alertController in: 
/Users/.../Xcode/DerivedData/AppName-cdtbqibmmbsosrdeyqughefeazaa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/x86_64/controller1.o 
/Users/.../Xcode/DerivedData/AppName-cdtbqibmmbsosrdeyqughefeazaa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/x86_64/controller2.o 

처럼 보인다 그리고 그것은 효과가있었습니다 ... 왜 이것을해야합니까? Xcode는 이러한 변수가 (이름 때문에) 동일한 방식으로 사용되고 있음을 알고 있으며, 어떻게 든 변수를 전역 적으로 선언해야합니까?

+1

인터페이스에서 속성으로 선언하십시오. – danh

+0

@danh 아, 그래. 그런데 왜 그런가요? [나를 용서해, 나는 객관적으로 꽤 새로운 사람이다] –

답변

4

문제는 이러한 변수가 인스턴스 변수가 아니라는 것입니다. 그것들은 전역 변수입니다. 당신이 그것을 가지고, 코드가 각 모듈에 같은 이름의 글로벌 선언

@implementation controller1 { 
    UIAlertController *alertController; 
} 

//more code 

@end 
+0

아, 고마워. 그리고 당신이 가지고있는 방식과 Danh가 추천 한 방식 사이에 그것이 클래스의 속성으로 만드는 것의 차이점이 있습니까? –

+1

제 방법은 인스턴스 변수의 선언을 수정합니다. Dan의 방법은 인스턴스 변수를 속성으로 대체합니다. 개인 속성이나 인스턴스 변수를 사용해야하는지 여부에 대한 많은 논쟁이 있습니다. 어느 쪽의 접근 방식이든 작동합니다. – rmaddy

+0

알겠습니다. 고마워요. 인스턴스 변수와 속성의 차이점을 읽어야합니다. 지금까지는 다른 방식으로 액세스 한 것처럼 보입니다. –

1

다음과 같이 그들에게 인스턴스 변수를 만들려면

는 그들은 @implementation 블록의 중괄호에 있어야합니다. 각 클래스에 대한 포인터를 비공개로 만들려면 ...

// controller1.m 

@interface controller1() 

@property(strong,nonatomic) UIAlertController *alertController; 
// any other property private to controller1 

@end 

@implementation controller1 

// only methods here 

@end 
+2

제대로 수정하기 위해 속성을 변경할 필요가 없습니다. – rmaddy

+0

감사합니다. 당신이 권장하는 것에 비해 @rmaddy가 권장하는 것/왜 추천했는지에 차이가 있습니까? 나는 그의 대답이 너의 것보다 약간 나타났기 때문에 rmaddy의 대답을 받아 들였다. –

+1

확실하지만 그 전에 내 질문에 댓글을 달았습니다. 차이점은 내가 덮개 아래에서 getter와 setter 메서드를 만드는 좀 더 현대적인 선언을 제안하는 것입니다. 따라서'self.alertController' 또는'self.alertController = // blah'라고 말할 수 있습니다. – danh

관련 문제