Level : WORDPRESS BOOK LINKEDIN PATENT Send Mail 동냥하기 hajunho.com

반응형


객체 지향 프로그래밍 언어인 Objective-C는 다양한 기능과 유연성 덕분에 오래전부터 많은 iOS 개발자들에게 사랑받아왔습니다. 그러나, 최근 몇 년간 많은 개발자가 Swift로 옮겨감에 따라, 기존 Objective-C 코드와의 호환성과 성능 문제를 해결해야 할 때도 많습니다.

이번 포스팅에서는 Objective-C 2.0 이상의 버전을 사용하며, 프로젝트에서 메모리 사용량이 100%에 달하는 구간이 있는 앱에서의 최적화 경험을 공유하고자 합니다.

### 1. 클래스 변수 대신 @property와 @synthesize 활용하기

클래스 변수를 최대한 자제하고, 대신 @property와 @synthesize를 사용하는 것이 좋습니다.

- iOS 업그레이드 후 클래스 변수 값이 날아가는 문제를 겪었습니다. 원인을 찾기 어려웠습니다.
- copy, retain을 사용하지 않고, nonatomic, assign만으로도 충분했습니다.
- 정확한 분석은 아니지만, 메모리를 많이 사용하는 모듈(예: 파싱, 데이터 처리 모듈)에서는 @property의 속성이 영향을 미치는 것 같습니다.

```objc
// 기존 클래스 변수
NSString *mData;

// 변경된 코드
@property (nonatomic, strong) NSString *mData;
@synthesize mData;

// BOOL 타입의 클래스 변수 경우
BOOL mIsAll;

// 변경된 코드
@property (nonatomic, assign) BOOL mIsAll;
@synthesize mIsAll;
```

### 2. User Defaults 땜빵의 한계와 @synthesize의 중요성

- 처음에는 몇 가지 문제만 발생하여 User Defaults로 해결했습니다. 그러나 코드가 커지면서 문제가 복잡해졌습니다.
- setter와 getter가 필요 없다고 @synthesize를 사용하지 않고 self 또는 _ 접두어로 변수를 사용했습니다. 그러나, 동료들이 코르도바(Cordova)를 사용하는 프로젝트에서 변수 값이 사라지는 문제를 리포트하며 @synthesize로 바꾸었더니 문제가 해결되었습니다.

결국 데이터 보존이 되지 않는 문제는 다양한 방식(콜백, 싱글톤, 델리게이트, DB 등)으로 해결할 수 있습니다. 그 중에서 DB가 가장 느리지만 가장 확실합니다.

### Swift와 Core Data

Swift에서는 Core Data라는 ORM이 있어 데이터 관리가 비교적 수월합니다. 그러나 엔터프라이즈급 데이터 CRUD 앱에서는 앱 서버가 항상 RDB를 물고 있습니다. 이 경우, 해당 데이터를 SQL이 아닌 형태로 재구현하는 것이 쉽지 않습니다.

### 임베디드 분야에서의 메모리 관리

임베디드 개발에서는 여전히 메모리 관리를 신경 써야 합니다. 안드로이드나 iOS 모두 동일한 문제를 겪습니다.

안드로이드에서는 액티비티가 죽었다 살아날 때 관련 리소스를 모두 재설정하는 것이 기법입니다. 그러나 iOS에서는 뷰컨(ViewController)이 내려가는 경우 메모리를 풀로 사용하는 모듈이 돌 때 참조가 0이 아닌 객체들도 청산되는 것을 보며, 더더욱 DB로 데이터를 관리해야겠다고 생각했습니다.

### 결론

결론적으로, View를 넘나드는 데이터는 전부 DB로 처리하는 것이 가장 안전합니다. 메모리 문제는 프로그래밍 언어와 운영체제가 알아서 해결해주기를 바라는 진심이 있습니다. 오래된 프로그래머로서, 아직도 메모리를 직접 관리해야 하는 C/C++이 믿음직하게 느껴지는 부분도 있습니다. Swift로의 마이그레이션은 쉽지 않지만 새로운 도전이기도 합니다. iOS 마이그레이션 시장이 활발해지길 기대해봅니다.

이번 포스팅이 Objective-C를 사용한 프로젝트에서 메모리 문제를 겪고 있는 개발자들에게 도움이 되길 바랍니다. 감사합니다.

---

이 포스팅은 개인적인 경험과 의견에 기반하여 작성되었습니다. 각 프로젝트의 상황에 맞게 최적화 방법을 선택하시기 바랍니다.

반응형

'C++' 카테고리의 다른 글

objc2C++PESDKConfiguration  (0) 2022.02.16
테이블 항목 기본 선택  (0) 2022.02.15
objc2C++UIAlertController  (0) 2021.05.31
C++와 Swift를 활용한 iOS 프로퍼티 정리  (0) 2021.05.26
objc2C++select 구현 예제  (0) 2021.05.26
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기