이것은 기본적인 Objective-C 질문이지만 신비화되어 있으며 다른 곳에서 답변을 찾지 못했습니다. MyObject를 호출 할 사용자 정의 클래스가 있습니다. 내 MainMenu.xib에는 해당 사용자 정의 클래스 내에서 IBAction을 트리거하는 버튼이 있습니다. 동일한 NIB 파일에서 클래스 MyObject의 개체 (파란색 큐브)가 있으므로 사용자 지정 클래스 내의 메서드 (IBAction)에 단추를 "연결"할 수 있습니다. 이 모든 것이 잘 작동합니다.IBAction에서 "self"는 객체의 첫 번째 인스턴스만을 나타냅니다.
MyObject의 인스턴스를 여러 개 만들 필요가 있습니다. 그 중 일부는 클래스 내에서 간단한 (void) 메소드이고 그 중 몇 개는 클래스에있는 IBActions에있는 몇 가지 메소드가 있습니다. MainMenu.xib 파일.
IBActions가 아닌 (void) 로컬 메소드에서 "self"를 사용할 때, 원하는대로 클래스의 현재 활성 인스턴스를 항상 참조합니다. IBActions에서 "self"를 사용할 때는 항상 해당 사용자 정의 객체의 첫 번째 인스턴스 만 나타냅니다.
나는 현재 활성 인스턴스를 MyObject에 대한 포인터로 추적하여이 문제를 쉽게 해결할 수 있지만 일부 방법에서는 "self"가 예상대로 작동하지만 IBActions에서는 그렇지 않은 이유를 알고 싶습니다. 그들 모두가 하나의 클래스 파일에 있다고 생각했습니다.
다음 코드가 무슨 뜻인지 설명하기위한 것입니다 (나는 그것이 작동하는 희망!) :
@implementation MyObject
MyObject *theActiveObject;
- (instancetype) init {
self = [super init];
if (self)
theActiveObject = self;
return self;
}
- (IBAction)showSelf:(id)sender {
NSLog(@"from an IBAction, my SELF is: %p theActiveObject: %p", self, theActiveObject);
[self showSelfOther];
}
- (void) showSelfOther {
NSLog(@"from a plain method: SELF is: %p theActiveObject: %p", self, theActiveObject);
}
내가 여러 활성 개체의 첫 번째 개체를 한 경우 (그 창을 클릭하여, 예를 들어) 다음, 나는 (시뮬레이션 주소를 사용하여) 얻는 결과는 다음과 같습니다 IBAction를에서
, 내 SELF는 다음과 같습니다 0xaddress01 theActiveObject : 일반 방법에서 0xaddress01
: SELF는 다음과 같습니다 0xaddress01 theActiveObject : 0xaddress01
그때 내 사용자 정의 클래스의 두 번째 개체의 창에 클릭하면, 내가 할 일 : IBAction를에서
, 내 SELF는 다음과 같습니다 0xaddress01 theActiveObject : 0xaddress02
평범한 방법에서: SELF은 다음과 같습니다 0xaddress02 theActiveObject : IBAction를에서 두 번째 객체에서 사용되는 "자기", 첫 번째 O를 가리키는 이유 0xaddress02
나는 보지 않는다 피하십시오. 이것을 이해하는데 도움이 될 것입니다.
덕분에,이 답변이 명확하고 의미가 있습니다 :
댓글 켄 Thomases (감사, 켄)의 응답에 대한 응답에 추가되었습니다. 앞에서 말한 것처럼 별도로 유지 관리되는 변수 (또는 배열)를 사용하여 MyObject의 각 인스턴스를 유지함으로써이 문제를 쉽게 해결할 수 있습니다. 어쨌든해야합니다. 그래서 내 질문은 이론이된다 : 이것을 "올바른"방법인가? MainMenu.xib (사용자 인터페이스에 있어야 함)에 사용자 정의 클래스의 메서드에 연결된 두 개의 버튼이 있습니다. 나는 MainMenu.xib의 커스텀 클래스를 나타내는 "blue cube"객체로만이 방법으로 연결할 수 있으며, 그 메소드 내에서는 "self"를 사용할 수 없다. 이것은 클래스의 다른 모든 메소드에서 "self"를 사용하기 때문에 잘못되었다고 생각합니다. 예상대로 작동합니다.이 메소드는 각 인스턴스마다 변경됩니다.
올바른 접근 방식입니까, 아니면 사용자 지정 클래스의 모든 메서드에서 "self"를 사용할 수 있도록 다른 전략을 사용해야합니까? 그렇다면 해당 전략은 무엇입니까?
커스텀 클래스의 첫 번째 인스턴스는 시작시 MainMenu.xib가로드 될 때 생성된다는 것을 알았습니다. 왜냐하면 그 파일에 "Blue Cube"가 있기 때문입니다. 나는 버튼을 사용하지 않고 커스텀 클래스의 메소드에 버튼을 연결하는 다른 방법을 모른다는 이유로 나는 파란색 큐브를 가지고있다. 내가 알아 내지 못한 것을 할 수있는 방법이 있습니까? 그렇다면 파란색 큐브를 제거하여 처음으로 자동으로 만들어진 사용자 지정 개체의 인스턴스를 제거 할 것으로 기대합니다. 따라서 맞춤 클래스의 모든 메서드에서 동일한 방식으로 자체를 사용할 수 있습니다.
이 주제에 관해 알려줄 수있는 모든 표시등은 대단히 감사하겠습니다. 다른 한편으로는, 나는 왜 나의 원래 질문에 두 번의 투표가 내려 졌는지 이해하지 못한다. 너무 멍청 해?
'self'는 항상 메소드가 호출 된 인스턴스를 나타내며 결코 다른 것을 참조하지 않습니다. – nhgrif