CLOSE SEARCH
POSTS TAGGED WITH: iPhone

Automatic Reference Counting (ARC)

Automatic Reference Counting (ARC) 는 컴파일 시에 자동으로 적절한 위치에 retain, release, autorelease와 같은 메모리 관리와 관련된 메소드를 추가해 가비지 컬렉터와 유사하는 기능을 제공하는 기술이다.

ARC는 Mac OS X v10.6과 v10.7용 xCode 4.2 이상에서 개발할 수 있으며 iOS4와 iOS5에서 지원된다. 약한 참조(weak reference)의 경우 iOS5이상에서만 지원된다.

ARC를 사용하기 위해 아래와 같은 규칙을 따라야한다.

  • retain, release, retainCount, autorelease, dealloc을 명시적으로 호출하거나 구현할 수 없다. 특히 dealloc 메소드를 구현하는 경우 상위 클래스 호출은 컴파일러에서 수행하기 때문에 [super dealloc]를 호출할 필요가 없으며, 실제로 이 코드는 컴파일 에러를 발생시킨다.
  • alloc: 를 사용해서 객체를 생성한다. 객체의 해제는 런타임이 담당한다.
  • C 구조체 내부에서 객체 포인터를 사용할 수 없다. 대신 클래스를 사용한다.
  • id와 void* 를 암시적으로 형변환 해주지 않는다.  컴파일러에게 객체의 수명에 대해 알려주는 특별한 형변환을 사용해야 한다.
  • NSAutorelease 객체를 사용할 수 없다. 대신 더 효율적인 @autoreleasepool 블록을 사용한다.
  • 더 이상 메모리 존을 사용할 수 없으며, 사용한다고 하더라고 런타임에 의해 무시된다.
  • ARC를 사용하지 않는 이전 코드와 함께 사용할 경우 new로 시작하는 속성명을 사용할 수 없다.
ARC에는 객체의 수명을 지정하는 몇가지 새로운 lifetime qualifier와 zeroing weak reference를 제공한다. 약한 참조는 대상 객체의 수명에 영향을 주지 않지만, zeroing weak reference는 대상 객체가 해제되면 자동으로 nil값을 가지게 된다.
ARC는 이전 참조 카운팅 방식에서 발생하던 strong reference cycles(retain cycle) 문제를 방지해주지 않으므로 신중하게 사용해야 한다.
@property의 속성에 새로운 strong, weak 키워드를 사용할 수 있다. 참조카운팅 방식에서 사용하던 아래의 코드는

ARC를 사용해서 아래와 같이 작성한다.

또한, 아래의 코드는

아래와 같이 작성한다.

assign을 사용하는 경우 myObject의 대상 객체가 해제되면 댕글링 포인터가 되지만, weak의 경우 nil로 설정된다.(zeroing weak reference)

 

ARC는 아래와 같은 새로운 Variable Qualifier를 제공한다.

  • __strong  : 기본값
  • __weak : zeroing weak reference. 대상 객체가 해제되면 nil이 됨.
  • __unsafe_unretained : weak reference. 대상 객체가 해제되면 댕글링 포인터가 됨.
  • __autoreleasing : id* 형식의 인수가 리턴시에 자동적으로 해제되도록 지정.
함수 내부에서 __weak를 사용할 경우 해당 객체의 유효성에 주의해야 한다.

위의 코드를 xCode에서 입력해보면 “Assigning retained object to weak variable; object will be released after assignment” 경고가 발생한다. weak 변수에 retain된 객체를 할당하게 되면 해당 객체가 할당된 후에 해제된다는 것이다. 실제로 위의 코드에서 alloc로 생성한 NSString 객체는 string에 할당된 직후에 해제되므로 2번 라인에서는 string : (null)이 출력된다.

 

ARC는 새로운 방식으로 Autorelease Pool을 사용한다. 참조 카운팅 방식에서와 같이 NSAutoReleasePool 객체를 직접 사용할 수는 없다.

 

아웃렛을 선언하는 방식 역시 ARC를 사용하는 방식에 맞게 변경되었다. File’s Owner와 nil 파일의 최상위 객체들은 strong, 그 외의 객체들은 weak 가 되어야 한다.

ARC를 사용하는 경우 strong, weak, autoreleasing 스택 변수들은 자동적으로 nil로 초기화 된다.

ARC를 활성화 하기 위해서는 -fobjc-arc 컴파일러 플래그를 사용한다. 프로젝트에서 ARC를 기본적으로 사용하는 경우 특정 파일에 대해 참조 카운팅 방식을 사용할 수도 있는데 해당파일에 -fno-objc-arc 플래그를 사용하면 된다.

위치, 방향 그리고 CoreLocation

CoreLocation 프레임워크는 현재 위치에 대한 정보를 제공해준다. 그 중에서도 중요한 역활을 하는 CLLocationManager 클래스는 iOS 2.0 이상의 디바이스에서 현재 위치와 방향에 대한 이벤트를 제공하고 관련 작업을 지원해 주는 클래스이다. 주요 기능들을 살펴보면

  • 정확도를 지정하여 사용자의 현재 위치 변화를 추적할 수 있다.
  • 디바이스에 내장된 나침반을 통해 방향의 변화를 감지하고 해당 정보를 얻어올 수 있다.
  • 사용자가 특정 지역으로 들어가거나 나오는 상황을 감지할 수 있다.

일부 정보의 경우 디바이스에 해당 정보를 얻거나 감시하는데 필요한 하드웨어를 내장하고 있어야 하며, CLLocationManager 클래스에서 이를 확인하는 메소드들을 제공하고 있다. 또한 이들 하드웨어는 전력을 많이 소비하므로 반드시 필요한 경우에만 활성화시켜야 한다.

  1. CLLocationManager를 이용하는 일반적인 순서는 아래와 같다.
  2. 해당 기능을 사용하기 전에 디바이스 지원 여부와 CLLocationManager 클래스에서 제공하는 메소드를 통해 해당 기능 사용 가능여부를 확인하고, 사용이 불가한 경우 작업을 취소한다.
  3. CLLocationMananger 클래스의 인스턴스를 생성한다.
  4. 델리게이트(CLLocationManagerDelegate)를 설정한다.
  5. 사용하고자 하는 기능과 관련된 속성들을 설정한다.
  6. 해당 기능과 관련된 시작 메소드를 호출하여 이벤트를 수신한다.

가속도계 / Accelerometer

iOS기반 디바이스에 내장된 가속도계에 접근하기 위해서는 UIAccelerometer 클래스를 통해 제공되는 공유 인스턴스를 이용한다. + (UIAccelerometer *)sharedAccelerometer 메소드를 통해 가속도계의 공유 인스턴스를 얻은 다음 업데이트 주기와 델리게이트를 설정하면 가속도계 변경 이벤트를 받을 수 있다. 설정 가능한 최대 주기값은 디바이스의 성능에 따라 다르지만 일반적인 앱에서는 1/10, 게임에서는 1/60 정도가 적당하다. 가속도계 사용을 마친 후에는 델리게이트를 nil로 설정한다.

 

UIAccelerometerDelegate

UIAcceleration 클래스는 가장 최근에 발생한 가속도 이벤트에 대한 정보(x, y, z, timestamp)를 가지고 있는 클래스이다. 각 축은 해당 방향으로의 중력 가속도를 나타내며 1.0은 중력가속도 1.0g를 의미한다.

Orientation of the device axes from iOS Developer Library

Using Socket on iOS Programming

소켓 컨텍스트 선언

 

소켓 생성
CFSocketRef CFSocketCreate (CFAllocatorRef allocator, SInt32 protocolFamily, SInt32 socketType, SInt32 protocol, CFOptionFlags callBackTypes, CFSocketCallBack callout, const CFSocketContext *context) 메소드를 이용해서 소켓을 생성한다.

 

주소 및 포트 설정

CFSocketError CFSocketSetAddress (CFSocketRef s, CFDataRef address) 메소드를 이용해서 생성된 소켓에 주소와 포트를 할당한다.

 

런 루프에 소켓 등록

생성된 소켓이 들어오는 접속요청이 있을 경우 콜백 함수를 호출할 수 있도록 런 루프에 소켓을 등록한다.

 

접속요청 처리 콜백함수 구현

다른 장치와의 데이터 송수신에 사용되는 스트림 객체를 생성한다. 콜백함수는 typedef void (*CFSocketCallBack) (CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info) 와 같은 형식의 메소드여야 한다.

 

소켓 무효화

소켓을 무효화 하면 런 루프에서 해당 소켓이 제거된다.

Play Audio – AVAudioPlayer

AVAudioPlayer 클래스는  iOS 2.2이상에서 사용가능한 클래스로 아래와 같은 기능을 제공한다.

  • Play sounds of any duration
  • Play sounds from files or memory buffers
  • Loop sounds
  • Play multiple sounds simultaneously, one sound per audio player, with precise synchronization
  • Control relative playback level and stereo positioning for each sound you are playing
  • Seek to a particular point in a sound file, which supports such application features as fast forward and rewind
  • Obtain data you can use for playback-level metering

Disable Idle Timer

IOS 기반 디바이스는 특정 시간동안 사용자 입력이 없으면 대기모드로 들어간다. 이런 동작을 방지하기 위해서는  Idle Timer를 비활성해야 한다.

Map on iOS – Data Types

Map Kit Data Types


Map on iOS – MKReversetGeocoder, MKReverseGeocoderDelegate, MKPlacemark

MKReverseGeocoder
맵 좌표를 주소 정보로 변환하는 클래스이다. 특정 좌표에 대한 Placemark 정보를 검색하는 네트워크 기반 서비스와 함께 동작하는 단일 객체이다.
Mapkit 어플리케이션은 제한된 수의 Reverse Geocoding 용량을 가지기 때문에 어플리케이션 구현시 이에 유의해야 한다.

  • 액션 내부에서는 하나의 Reverse geocoding 요청을 보내는 것이 좋다.
  • 동일한 좌표에 대해 다수의 reverse geocoding이 필요하다면 각각의 액션에서 개별적으로 요청하는 대신 초기화된 reverse-geocoding request를 재사용하는 것이 좋다.
  • 특수한 상황을 제외하고 1분에 1개 이상의 Reverse geocoding 요청을 보내는 것은 좋지 않다.
  • 사용자가 즉시 결과를 보지 않을 때에는 각각의 reverse-geocoding request를 시작하지 않는것이 좋다.


Map on iOS – MKUserLocation, MKAnnotationView, MKAnnotation Protocol

MKUserLocation
현재 위치 정보를 나타내는 클래스로 인스턴스를 직접 생성하면 안되고, MKMapView의 userLocation 속성을 통해 접근해야 한다.


MKAnnotationView

  • Annotation을 지도에 표시하기위해 사용되는 뷰 객체로 표시되는 Annotation은 MKAnnotation 프로토콜을 따르는 객체여야 한다.
  • AnnotationView는 지도에 실제로 표시되는 시점에 mapView:viewForAnnotation: 델리게이트 메소드를 통해서 지도에 제공된다.
  • image 속성을 설정해서 지도에 제공하는 것이 가장 효과적인 방법이다. AnnotationView는 image 크기에 맞게 자동으로 변경된다.
  • drawRect: 메소드를 오버라이드 하는 경우 image 속성을 통해 이미지를 설정할 수 없고, frame 속성을 이용해 뷰의 크기를 지정해주어야 한다.
  • 맵의 줌 스케일과 상관없이 항상 같은 크기를 가진다.
  • 선택 상태를 지정할 수 있다.
  • 서브클래스에서 초기화 메소드를 추가한 경우 initWithAnnotation:reuseIdentifier: 메소드를 통해 슈퍼클래스를 초기화해야 한다.
  • leftCalloutAccessoryView를 통해서 callout 뷰를 특정 뷰로 대체할 수 있다.
  • iOS 4.0 이상에서 드래그 기능을 지원하고자 하는 경우 dragState를 변경하는 코드를 추가해 주어야한다.


MKPinAnnotationView
MKAnnotation 클래스를 상속받는 클래스로 지도에 핀 모양의 Annotation을 추가할때 사용한다.


MKAnnotation Protocol
Annotation 정보를 담는 객체가 공통적으로 구현해야할 프로토콜이다. coordinate 속성은 반드시 구현해야 한다.

  • coordinate : CLLocationCoordinate2D 형식의 가운데 좌표
  • setCoordinate: – 가운데 좌표를 설정하는 메소드
  • title – NSString* 형식의 타이틀 문자열을 리턴하는 메소드
  • subtitle – NSString* 형식의 서브타이틀 문자열을 리턴하는 메소드
  • MKAnnotation 프로토콜을 따르는 객체 구현 예제



크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.