차례:
- 선언 된 속성은 선언과 구현이라는 두 부분으로 구성됩니다.
- Objective-C는 접근 자 메서드를 호출하기 위해 대괄호 표기법 ([]) 대신 사용할 수있는 도트 (.) 연산자를 제공합니다. C 구조체 요소에 액세스 할 때와 같은 방법으로 도트 구문을 사용합니다.
- 예를 들어 사용하지 않을 수도있는 객체를 만드는 데 많은 오버 헤드가 발생하면 처음 액세스 할 때 객체를 만드는 getter 접근자를 직접 만들 수 있습니다.또한 직접 접근자를 작성한다는 것은 속성과 연결된 인스턴스 변수를 가질 필요가 없다는 것을 의미합니다.
- _currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey : CurrentDestinationKey];
비디오: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2024
속성 및 인스턴스 변수 액세스 및 접근자는 종종 iOS 앱 프로그래머는 속성의 고유 한 특성과 실제로 작동하는 방식을 이해해야합니다.
메소드 는 일을 끝내기 위해 객체에 메시지를 보내는 것과 관련이 있지만, 속성 은 객체의 상태와 관련이 있습니다. 프레임 워크와 다른 객체는 속성에서 찾은 것을 기반으로 동작합니다 (따라서 속성을 변경하여 객체 비헤이비어를 수정할 수 있습니다).
뷰와 모델 사이의 다리 역할을하는 앱의보기 컨트롤러는 데이터를 가져 와서 업데이트를 보내기 위해 모델 개체를 찾을 수 있어야합니다. 이 모든 작업은 속성을 사용하여 수행됩니다. 속성은 다음과 같습니다.
@property (강하고 비 구조) IBOutlet UIImageView * car;
그러나 모든 부동산이 아울렛이 아닙니다. RTAppDelegate를 선택하는 경우. h 파일을 열면 프로젝트 속성에
보시다시피 속성의 순서 (강하고 비 원자 대 비 원자, 강함)는 중요하지 않습니다.
선언 된 속성을 구성하는 것
선언 된 속성은 선언과 구현이라는 두 부분으로 구성됩니다.
선언은 @property 키워드를 사용하고 선택적으로 괄호로 묶인 속성 집합, 유형 정보 및 속성 이름을 사용합니다.
속성과 연결된 getter 및 setter 메서드의 기본 이름은 getter에 대한
whateverThePropertyNameIs 및 setter에 대한 setWhateverThePropertyNameI: 입니다. trip의 경우 getter 메소드는 trip이고 setter 메소드는 setTrip:입니다. appDelegate에서 여행 속성에 액세스하려면
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; 여행 * thisTrip = [appDelegate 여행];
또는 해당 속성을 설정하려면
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; [appDelegate setTrip: newTrip];
위임자는 UIApplication 속성입니다.
도트 구문 사용
Objective-C는 접근 자 메서드를 호출하기 위해 대괄호 표기법 ([]) 대신 사용할 수있는 도트 (.) 연산자를 제공합니다. C 구조체 요소에 액세스 할 때와 같은 방법으로 도트 구문을 사용합니다.
Trip * thisTrip = appDelegate. 여행;
또는 해당 속성을 설정하려면
appDelegate를 사용하십시오. 여행 = newTrip; 그러나 오브젝트와 함께 사용하면 도트 구문은 "구문 적 설탕"역할을합니다. 컴파일러가 접근 자 메시지로 변환합니다. 도트 구문은 인스턴스 변수를 직접 가져 오거나 설정하지 않습니다. 이 예제를 사용하는 코드 예제는 대괄호 표기법을 사용하는 것과 정확히 동일합니다.
많은 프로그래머가 읽을 수 있기 때문에 도트 구문을 좋아합니다. 다른 객체 (다른 객체의 속성 등)의 속성 인 속성에 액세스하는 괄호 표기법 상황을 생각해보십시오.
도트 구문의 진정한 장점은 컴파일러가 읽기 전용 선언 된 속성에 쓰려고 시도를 감지하면
오류
를 생성한다는 것입니다. 존재하지 않는 setter 메서드를 호출했기 때문에 선언되지 않은 메서드 경고 를 처리하는 것보다 훨씬 낫습니다. 런타임에 응용 프로그램이 실패하기 때문입니다. 컴파일러를 사용하여 접근 자 메서드를 만들면 컴파일러는 선언 한 형식의 인스턴스 변수를 만들어 속성 값을 속성 이름과 함께 저장하고 검색하는 데 사용합니다. 예를 들어 다음과 같은 속성: @property (weak, nonatomic) IBOutlet UIImageView * car;
문장
@synthesize car;
는 UIImage 유형의 car라는 이름으로 인스턴스 변수를 생성합니다.
그러나 컴파일러에서 자동으로 @synthesize 문을 생성하게하는 경우 실제로 밑줄 문자로 시작하는 인스턴스 변수 이름을 사용하므로 장면 뒤에있는 다음 코드가 생성됩니다.
자동차를 합성 = _car;
이것은 속성 이름 (self. car에 의해 접근 됨)과 인스턴스 변수 이름 (_car로 간단하게 접근 됨)을 구분할 수있게 해줍니다.
Apple은 일반적인 방법에서는 속성 참조 (self car)를 사용하지만 init 메서드에서는 _car 변수를 사용하는 것이 좋습니다. 이것은 파일 내의 코드에만 적용됩니다. 앱의 다른 곳의 코드는의 @interface 섹션에 선언 된대로 속성에 액세스합니다. h.
코드를 제외한 앱의 모든 부분에 코드가 없습니다. m 파일은 컴파일러가 작업을 수행 할 때 인스턴스 변수에 직접 액세스 할 수 있습니다. 캡슐화가 제대로 이루어 지도록하는 것이 좋습니다.
자신의 접근 자 작성하기
컴파일러에 의해 생성 된 접근자를 사용할 필요는 없습니다. 때로는 직접 구현하는 것이 좋습니다. 접근 자 메서드를 직접 구현하는 경우 접근 방식이 선언 한 특성과 일치하는지 확인해야합니다.
예를 들어 사용하지 않을 수도있는 객체를 만드는 데 많은 오버 헤드가 발생하면 처음 액세스 할 때 객체를 만드는 getter 접근자를 직접 만들 수 있습니다.또한 직접 접근자를 작성한다는 것은 속성과 연결된 인스턴스 변수를 가질 필요가 없다는 것을 의미합니다.
예를 들어 사각형을 나타내는 객체에 면적 속성을 지정할 수 있습니다. 영역에 대한 getter는 길이 x 너비를 수행하고 인스턴스 변수로 신경 쓰지 않아도됩니다.
접근자를 사용하여 인스턴스 변수에 액세스
self를 사용하지 않으면 인스턴스 변수에 직접 액세스합니다. 다음 예제에서는 _currentDestinationIndex에 대한 set 접근 자 메서드가 호출되지 않습니다.
_currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
앞은
와 동일하지 않습니다. currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
접근자를 사용하려면 자체를 사용해야합니다.