건의25: 속성의 안팎을 철저히 이해하다

4798 단어
속성은 클래스나 대상의 중요한 특성으로 대상을 대상으로 봉인하는 중요한 현금 인출이다.1. 대부분의 속성은 실례 변수에 의해 지원되며 기본적으로 읽기와 쓰기 속성은 실례 변수에 의해 지원되며 다시 컴파일러가 자동으로 합성합니다.실례 변수는 변수이며 대상의 생명 주기 내에 존재하고 보유하는 값이다.실례 변수는 처음 만들 때 메모리에 분배되고 대상이 놓여 있는지 여부에 따라 방출됩니다.
별도로 지정하지 않는 한 작성된 인스턴스 변수는 거의 속성과 동일한 이름을 가지지만 작성된 인스턴스 변수에는 밑줄 머리말이 있습니다.예를 들어, 속성 이름의 fistName의 경우 작성된 인스턴스 변수는 이 됩니다.firstName.
비록 대상이 자신에 접근하는 가장 좋은 방법은 속성 접근기 방법이나 점 방법을 사용하는 것이다.그러나 클래스 실현에서 더욱 직접적인 방식은 어떤 실례적인 방법으로든 실례 변수에 접근하는 것이다.밑줄 접두어를 사용하면 로컬 변수가 아닌 인스턴스 변수에 액세스할 수 있습니다. 예를 들어,
- (void)someMethod{
   NSString * myString = @"An intersting string";
   _someString = myString;
}

이 예에서 분명히 mystring은 국부 변수이다.someString은 인스턴스 변수입니다.
일반적인 상황에서 방문기 방법이나 속성을 사용하여 점 문법에 접근해야 한다. 설령 한 대상의 속성에 접근한다고 해도.자신의 실현 안에서 문법에 접근하더라도 이런 상황에서 가장 좋은 방법은self를 사용하는 것이다.이렇게
- (void)someMethod {
    NSString * myString = @"An intersting string";
    self.someString = myString;
    [self setSomeString:myString];
}

이 규칙의 예외는 초기화하거나, 액세서리 방법을 해제하거나, 사용자 정의할 때입니다.
(1) 작성 인스턴스 변수 이름을 사용자화할 수 있습니다.앞에서 언급한 바와 같이 기본적으로 쓰기 가능한 속성에 사용되는 실례 변수는 이라고 한다propertyName.사용하고자 하는 실례 변수가 다르면, 실현에서 컴파일러가 합성한 변수를 지시하고, 아래의 문법을 사용해야 한다.
@implementation YourClass
@synthesize propertyName = instanceVariableName;
......
@end

예를 들면 다음과 같습니다.
@synthesize firstName = ivar_firstName;

이 경우, 이 속성은firstName이라고 불리며,firstName과setFirstName: 접근 방법이나 점 문법을 통해 이 속성에 접근할 수 있지만,ivar 라는 이름을 가진다.firstName의 인스턴스 변수가 지원됩니다.
(2) 속성이 없어도 인스턴스 변수를 정의할 수 있습니다.추적할 가치가 있는 대상이나 다른 대상에 있을 때 가장 좋은 방법은 대상의 속성을 사용하는 것이다.등록 정보를 선언하지 않고 인스턴스 변수를 정의해야 하는 경우 클래스 인터페이스나 구현의 맨 위에 이러한 등록 정보를 괄호 안에 추가할 수 있습니다.
@interface SomeClass : NSObject {
       NSString * _myNonPropertyInstanceVariable;
}
……
@end 
@implementation SomeClass {
      NSString * _anotherCustomInstanceVariable;
}

2. 속성은 정적 동태의 구분이 있다oc2.0에 동적 속성을 정의하는 데 사용할 새 키워드 @dynamic이 추가되었습니다.동적 속성 음향도와synthesize란 컴파일러가 자동으로 setter나 Getter를 생성하는 것이 아니라 개발자가 직접 쓴 setter나 Getter가 아니라 실행할 때 동적으로 추가한 setter와 Getter입니다.
일반적으로 하나의 속성을 정의하는데, 모두 아래와 같은 코드를 사용한다.
@interface Car:NSObject;
@property (retain) NSString * name;
@end
@implement : Car;
@synthesize name;
@end

이 경우 @synthesize 키워드는 컴파일러가 setter와 Getter를 자동으로 실행하도록 알려 줍니다.또한 @synthesize를 사용하지 않으면 Getter와setter를 스스로 실현할 수 있습니다. 예를 들어 아래의 코드와 같습니다.
@implement Car;
- (NSString *) name {
     return _name;
}
- (void) setName:(NSString *)n{
     _name = n;
}

현재 @dynamic을 통해 세 번째 방법으로name의setter와getter를 실현할 수 있습니다.동적 속성을 실현하려면 코드에 resolveInstanceMethod를 덮어써서name의 setter와 Getter를 동적으로 추가해야 합니다.이 방법은 매번 방법을 찾지 못할 때마다 호출된다.실제로 NSObject의 기본 구현은 예외를 제거하는 것입니다.
다음은 동적 속성을 정의하고 동적 속성을 실현하는 코드입니다.Car 헤드 파일 Car.h의 코드:
@interface Car :NSObject
@property (retain) NSString * name;
@end

3. 클래스의 속성은'왜곡'할 수 있다
oc에 속성 (Property) 이 있기 전에, "개인"의 구성원 변수 앞에서 ""을 사용해야 합니다접두사나중에 속성(Property)이 생기면 구성원 변수가 다른 클래스에 접근할 수 있다면 속성(Property)을 사용해야 한다.그래서 사람들은 속성이'고정불변, 왜곡할 수 없다'는 인식 습관을 길렀다.습관을 언급하면 바로 이런 고전 코드가 뇌에 나타난다.
@interface MyClass : NSObject
@property (nonatomic ,assign) NSInterger correctCount;
@property (nonatomic,readonly,strong)NSString * quote;
- (id) initWithQuiz:(NSString *)plistName;
- (void) nextQuestion: (NSString *NSUInteger) idx;
- (BOOL) checkQuestion:(NSUinteger) question forAnswer: (NSUInteger) answer;
@end

부류의 속성correctCount와quote를 어떻게 변경하는지에 대해 많은 사람들이 사용하지 않았거나 보지 못했을 수도 있다.등록 정보(Property) 앞에 private, 즉
@private property (nonatomic,assign) NSInteger correctCount;
@private property (nonatimic,readonly,strong)NSString * quote;

혹은
@private @property (nonatomic,assign) NSInteger correctCount;
@private @property (nonatomic,readonly,strong) NSString * quote;

위의 두 가지 방식으로 수정하여 컴파일합니다. 통과할 수 있는지 없는지를 보십시오.이런 문법은 비합법적이다.그러면 어떻게 부류의 속성에 대해'왜곡'을 실현합니까?oc의 클래스 확장(Extensions)을 사용할 수 있습니다.
위 클래스의 속성 correntCount 및 quote를 "변조"할 경우 클래스 확장을 통해 다음을 수행할 수 있습니다.
@interface Quiz()
      @property (nonatomic,assign) NSInteger correctCount;
      @property (nonatomic,strong) NSString * quote;
@end

이렇게 하면 로컬 내부에서 이 속성들을 읽고 쓸 수 있다.그러나 외부에서 이러한 속성은 여전히 읽기 전용으로 나타나 하나의 속성인'안팎이 다르다'는 것을 형성한다.
포인트 #######
(1) 속성의 동적 정의입니다. 키워드 @dynamic이 필요합니다.속성 동적성은 @synthesis에 비해 컴파일러가 자동으로 setter나 Getter를 생성하는 것이 아니라 실행할 때 동적으로 추가한 setter와 Getter입니다.(2) 속성은 동적성을 채택하여 정적성에 비해 코드의 작성을 간소화하고 코드의 관리에 편리하다.(3) 기본적으로 쓰기 가능 속성에 사용되는 실례 변수는 이라고 한다propertyName.만약 사용한 실례 변수가 서로 다른 명령을 사용한다면, 실현에서 컴파일러가 합성한 변수를 표시해야 한다.(4) 클래스 확장을 이용하여 속성에 대한'변경'을 실현할 수 있다.

좋은 웹페이지 즐겨찾기