iphone - for - xcode 6.1 download



Objective-C의 숨겨진 기능 (6)

ISA 스위칭

객체의 모든 동작을 무시해야합니까? 실제로 한 줄의 코드로 활성 객체의 클래스를 변경할 수 있습니다.

obj->isa = [NewClass class];

이는 해당 객체에 대한 메소드 호출을받는 클래스 만 변경합니다. 메모리에서 오브젝트의 레이아웃을 변경하지 않습니다. 따라서 이것은 동일한 ivars (또는 다른 클래스의 서브 세트가있는 클래스)가있는 클래스 세트를 가지고 있고 그 사이를 전환하려는 경우에만 유용합니다.

필자가 작성한 코드 중 하나는 지연로드에이 코드를 사용합니다. 클래스 A 의 객체를 할당하고 몇 개의 중요한 ivars (이 경우 주로 레코드 번호)를 LazyA isa 포인터를 LazyA 를 가리 키도록 LazyA 합니다. releaseretain 과 같은 매우 작은 세트가 아닌 다른 메소드가 호출되면, LazyA 는 디스크로부터 모든 데이터를로드하고, ivars를 채우고, isa 포인터를 다시 A 전환하고, 호출을 실제 클래스로 전달합니다.

https://src-bin.com

Objective-C는 Mac OS X 및 iPhone 개발을 위해 Apple에서 사용하기 때문에 더 널리 사용되고 있습니다. Objective-C 언어에서 가장 좋아하는 "숨겨진"기능은 무엇입니까?

  • 답변 당 한 기능.
  • 문서에 대한 링크뿐만 아니라 기능의 예와 간단한 설명을 제공하십시오.
  • 제목을 첫 번째 줄로 사용하여 지형지 물에 라벨을 지정합니다.

Answer #1

메서드 Swizzling

기본적으로 런타임에 메소드의 구현을 다른 것으로 구현할 수 있습니다.

다음은 코드에 대한 설명입니다.

하나의 영리한 사용 사례는 공유 리소스를 sharedFoo 로드하는 데 사용됩니다. 일반적으로 공유를 가져 와서 필요한 경우 foo 만들고 주소를 가져와 잠금을 해제 한 다음 foo 를 반환하여 sharedFoo 메소드를 구현합니다. 이렇게하면 foo 는 한 번만 생성되지만 이후의 모든 액세스는 더 이상 필요하지 않은 잠금을 사용하여 시간을 낭비합니다.

Swizzling 메서드를 사용하면 이전과 동일하게 수행 할 수 있습니다. 단, foo 가 생성 된 경우를 제외하고는 sharedFoo 사용하여 sharedFoo 의 초기 구현을 검사를하지 않고 단순히 생성 된 것으로 알고있는 foo 를 반환하는 두 번째 구현으로 교체하십시오 !

당연히 방법 swizzling는 말썽으로 당신을 얻을 수 있고, 위 사정이 나쁜 생각 인 상황이 있을지도 모르지만, 어이 ... 저것은 왜 숨겨 지은 특징이다.


Answer #2

필자는 모든 인수에 레이블이있는 [myArray writeToFile:myPath atomically:YES] 와 같은 상세한 메서드 이름을 좋아합니다.


Answer #3

Objective-C 런타임 참조

Objective-C의 구문 설탕이 Object-C 런타임 인 ​​일반적인 C 함수 호출로 변환된다는 사실을 쉽게 잊을 수 있습니다. 런타임에서 실제로 아무것도 조사하고 사용하지 않아도 될 가능성이 큽니다. 그래서 이것을 '숨겨진 기능'이라고 생각합니다.

런타임 시스템을 사용하는 방법을 알려 드리겠습니다.

누군가 제 3자가 사용할 외부 프레임 워크 API를 설계한다고 가정 해 보겠습니다. 그리고 누군가가 추상적으로 데이터 패킷을 나타내는 프레임 워크에서 클래스를 설계한다면, 우리는 이것을 MLAbstractDataPacket 이라고 부를 것 MLAbstractDataPacket . MLAbstractDataPacket 을 서브 클래스 MLAbstractDataPacket 하고 서브 클래스 데이터 패킷을 정의하는 것은 프레임 워크에서 링크하는 애플리케이션에 MLAbstractDataPacket 있다. 모든 하위 클래스는 +(BOOL)isMyKindOfDataPacket:(NSData *)data 메서드를 재정의해야합니다.

그 정보를 염두에두고 ...

MLAbstractDataPacket +(id)initWithDataPacket:(NSData *)data 형식으로 제공되는 데이터 패킷에 대해 올바른 초기화 된 클래스를 반환하는 편리한 메서드를 제공하면 좋을 것입니다.

여기에 단 하나의 문제가 있습니다. 수퍼 클래스는 해당 하위 클래스에 대해 알지 못합니다. 그래서 여기서 런타임 메소드 objc_getClassList()objc_getClassList() 와 함께 사용하여 MLAbstractDataPacket의 서브 클래스 인 클래스를 찾을 수 있습니다. 일단 하위 클래스 목록이 있으면 +isMyKindOfDataPacket: 을 각각 시도 할 수 있습니다.

이에 대한 참조 정보는 http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html 에서 확인할 수 있습니다.


Answer #4

카테고리

범주를 사용하면 서브 클래 싱없이 내장 클래스에 메소드를 추가 할 수 있습니다. 전체 참조 .

NSString이나 NSData와 같이 일반적으로 사용되는 클래스에 편리한 메소드를 추가하는 것이 좋습니다.


Answer #5
#include <Foundation/Debug.h>

해당 헤더 파일에서 메모리 누수, 조기 탈퇴 등을 추적하기위한 도구가 많이 있습니다.





hidden-features