Effective Objective-C 2.0 학습 노트(1)

4605 단어
본고는 이라는 책의 독서 노트이다.이 책은 52개의 코드를 작성하는 건의를 제기하고 분류하고 상세하게 논술했다. 본고는 책 속의 각 장과 소절을 인용하고 자신의 이해에 따라 적당한 확대를 하여 책 속의 관건적인 정보를 최대한 완전하게 나타낼 수 있기를 바란다.

Objective-c 숙지

  • 클래스의 헤더 파일에는 @class 키워드를 사용하여 전방향 성명을 하는 것을 최소화하고 헤더 파일 정의 클래스에서 관련 헤더 파일을 인용하지 않고 코드에 다시 도입하면 컴파일 효율을 높일 수 있으며 순환 인용의 발생을 방지할 수 있다.(상속과 비위탁용도의 협의는 제외)
  • 다용도 서면량 문법은 호출구 함수보다 간단명료하고 직관적
  • 형식 상수를 많이 사용하고 #define 예처리 명령을 적게 사용하며static const 키워드로 형식 정보가 있는 상수를 정의합니다. (컴파일할 때 #define처럼 바뀌지만 형식 정보가 있습니다.) 개인 상수는 정의해야 할 실현 파일입니다.extern 키워드를 사용하여 전역 상수를 정의합니다. (전역 기호표에 놓을 것입니다.) 클래스 이름을 접두사로 하고, 헤더 파일에 설명하고, 실행 파일에 값을 정의할 수 있습니다.
  • 상태, 옵션, 상태 코드
  • 를 매거진으로 표시
  • 상태기의 상태, 전달 방법의 옵션 유적지 상태 코드 등 값을 매개로 표시하고 이 값에 알기 쉬운 이름을 지어야 한다.
  • 만약에 어떤 방법에 전달되는 옵션을 매거형으로 표시하고 여러 옵션을 동시에 사용할 수 있다면 각 옵션의 값을 2의 멱으로 정의하여 위치나 조작을 통해 조합하도록 한다.
  • 용 NSENUM 및 NSOPTIONS 매크로는 열거 유형을 정의하고 기본 데이터 유형을 나타냅니다.이렇게 하면 매거진이 개발자가 선택한 하위 데이터 형식으로 이루어지고 컴파일러가 선택한 형식을 사용하지 않는다는 것을 확보할 수 있다.
  • 매거 유형을 처리하는 switch 문장에서default 지점을 실현하지 마십시오.이렇게 하면 새로운 매거진을 추가하면 컴파일러는 개발자에게 switch 문장이 모든 매거진을 처리하지 않았다고 알립니다.

  • 객체, 메시지, 런타임 관련

  • 이해property
  • @property 문법을 통해 대상에 봉인된 데이터를 정의할 수 있습니다.
  • '특질'을 통해 데이터 저장에 필요한 정확한 의미(원자성: atomic/nonautomic, 읽기와 쓰기 권한:readonly/readwrite, 메모리 관리 의미:assign/strong/week/unsafe unretained/copy, 방법명 getter=/setter=)
  • 속성에 대응하는 실례 변수를 설정할 때 반드시 이 속성이 성명한 의미를 따라야 한다(copy의 의미 주의).
  • iOS 프로그램을 개발할 때 nonatomic 속성을 사용해야 한다. 왜냐하면 tomic 속성은 성능에 심각한 영향을 줄 수 있기 때문이다(원자성을 유지하기 위해 동기화 자물쇠를 사용한다).
  • 대상 내부에서 가능한 한 실례 변수에 직접 접근
  • 대상 내부에서 데이터를 읽을 때는 실례 변수를 통해 직접 읽어야 하고 데이터를 쓸 때는 속성을 통해 써야 한다.(Getter/setter 방법의 기능을 고려해야 하며, 업무 논리가 있으면 읽기와 쓰기 방법을 사용해야 한다)
  • 초기화 방법과 dealloc 방법에서는 항상 실례 변수를 통해 데이터를 직접 읽어야 한다(하위 클래스는 읽기 방법을 다시 쓸 수 있기 때문에 초기화 과정에서 호출하면 잠재적인 문제를 일으킬 수 있다).
  • 때때로 타성 초기화 기술로 특정한 데이터를 설정하는데 이런 경우 속성을 통해 데이터를 읽어야 한다.(Getter 방법에서 값이 있는지 판단하고 없으면 대상을 만들고 실례에 값을 부여한다)
  • '대상 등 동성'이라는 개념을 이해
  • 대상의 등동성을 측정하려면 "isEqual:"과hash방법을 제공하십시오.
  • 같은 대상은 반드시 같은hash코드를 가져야 하지만 두 개의hash코드가 같은 대상은 반드시 같지 않다(hash코드가 충돌할 수 있다).
  • 각 속성을 맹목적으로 하나하나 감시하지 말고 구체적인 수요에 따라 검측 방안을 제정해야 한다.
  • hash방법을 작성할 때 계산 속도가 빠르고 해시코드 충돌 확률이 낮은 알고리즘을 사용해야 한다.
  • "패밀리 모드"숨기기로 세부 사항 구현
  • 류족 모델은 디테일을 실현하는 것을 간단한 공공 인터페이스 뒤에 숨길 수 있다.(공장 방법을 통해 서로 다른 유형의 하위 클래스를 만드는 실례)
  • 시스템 프레임워크에서 클래스(UIButton, NSArray...)를 자주 사용합니다.
  • 클래스족의 공공 추상 기류에서 서브클래스를 계승할 때 조심해야 하며 개발 문서가 있으면 먼저 읽어야 한다.
  • 기존 클래스에서 사용자 정의 데이터를 연결 개체(Associated Object)로 저장
  • '연관 대상'메커니즘을 통해 두 대상을 연결할 수 있다. 다음과 같은 방법
  • 을 사용한다.
        //       : #import 
        void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
        id objc_getAssociatedObject(id object, const void *key); 
        void objc_removeAssociatedObjects(id object);。
    
  • 관련 대상을 정의할 때 메모리 관리의 의미를 지정하여 속성을 정의할 때 사용하는'보유 관계'와'비보유 관계'를 모방할 수 있다.
  • 다른 방법이 불가능할 때만 관련 대상을 선택해야 한다. 왜냐하면 이런 방법은 찾기 어려운 버그를 도입하기 때문이다.
  • 이해objcmsgSend의 역할
  • 메시지는 수용자, selector 및 매개 변수로 구성된다.어떤 대상에게 메시지를 보내는 것도 이 대상에서 호출하는 방법과 같다.
  • 어떤 대상에게 보내는 모든 메시지는'동적 메시지 발송 시스템'으로 처리하고 이 시스템은 대응하는 방법을 찾아 코드를 집행한다.
  • 메시지 전달 메커니즘 이해
  • 대상이 어떤 selector에 응답하지 못하면 메시지 전송 프로세스에 들어갑니다.
  • 운행기의 동적 방법 해석 기능을 통해 우리는 어떤 방법이 필요할 때 클래스(+(BOOL)resolveInstanceMethod:(SEL)sel에 추가할 수 있다.
  • 클래스 중 가동 방법 BOOL classaddMethod(Class cls, SEL name, IMP imp, const char *types); ).
  • 대상은 해석할 수 없는 일부 selector를 다른 대상 처리(-(id) forwardingTargetForSelector: (SEL) aSelector;)에 전달할 수 있다.
  • 상기 두 단계를 거친 후에도 selector를 처리할 수 없다면 완전한 메시지 전송 메커니즘(-(void) forwardInvocation: (NSInvocation*) anInvocation;을 시작합니다.
  • method swizzling으로 블랙박스를 디버깅하는 방법
  • runtime에서 selector에 대응하는 방법을 클래스에 추가하거나 교체할 수 있음(void method exchange Implementations(Method m1, Method m2);
  • 다른 실현을 사용하여 기존의 방법을 대체하여 실현한다. 이 공정은method swizzling이라고 하는데 개발자들은 이 기술을 이용하여 원래의 시선에 기능을 추가한다.
  • 일반적으로 디버깅 프로그램이 있을 때만 런타임에서 방법을 수정해야 하기 때문에 이런 방법은 남용하면 안 된다.
  • '클래스 대상'의 의도 이해
  • 모든 실례는 클라스 대상을 가리키는 지침을 가지고 그 유형을 나타내는데 이런 클라스 대상은 누적된 계승 체계를 구성한다.
  • 대상 유형이 컴파일링 기간에 확정되지 않으면 유형 정보 조회 방법을 사용해야 한다.
  •   - (BOOL)isMemberOfClass:(Class)aClass; //               
      - (BOOL)isKindOfClass:(Class)aClass; //                   
    
  • 가능한 유형 정보 조회 방법을 사용하여 대상 유형을 확정하고 유형 대상을 직접 비교하지 않는다. 왜냐하면 일부 대상은 메시지 전달 기능을 실현할 수 있기 때문이다.
  • 좋은 웹페이지 즐겨찾기