3. Framework: weak linking

이미지
3. Framework: weak linking 이번 포스트에서는 저번 포스트에 이어서 Framework의 weak linking에 대해서 알아보려고 합니다. weak linking이란? 먼저, 상황을 먼저 설명드리겠습니다. 최신 OS가 출시되면서 새로운 기능이 추가되었습니다. 이 기능은 당연히 이전 버전OS에서는 없는 기능이기 때문에 동작할 수 없습니다. 이전 버전 OS와 최신OS를 지원하는 framework를 제작하는데 최신OS에서 동작하는 새로운 기능도 지원하고 싶을 때 문제가 발생합니다. 새로운 기능은 이전 버전 OS에서는 동작하지 않기 때문에 오류가 발생합니다. 이 문제를 해결하기 위해서 나온 해결책이 weak linking입니다. weak linking은 심볼이 framework에 존재하지 않으면 null로 변경하고 심볼이 존재하면 동작을 수행합니다. weak linking을 통해 이전 OS의 호환성을 유지하면서 새로운 OS에 기능 추가를 할 수 있는 유연성을 발휘할 수 있습니다. weak linking이 어떻게 동작하는지 예제를 통해서 알아보겠습니다. WeakFramework를 Objective-C용 framework로 생성한 후 WeakTest.h와 WeakTest.c파일을 아래와 같이 생성합니다. // WeakTest.h 파일 #ifndef WeakTest_h #define WeakTest_h #include < stdio . h > #endif /* WeakTest_h */ // WeakTest.c 파일 #include "WeakTest.h" void WeakFunc ( void ) { printf ( "Weak Func가 호출되었습니다.\n" ) ; } Sample App 프로젝트를 생성하고 ViewController.m파일에 아래와 같이 코드를 작성합니다. # import "ViewContr

2. Framework: 이름충돌

이미지
2. Framework: 이름충돌 지난 포스트에서 framework에 대해서 알아보았습니다. 이번 포스트에서는 여러 framework를 한 프로젝트에서 사용할 때 발생할 수 있는 이름 충돌에 대해서 알아보려고 합니다. 여러 framework를 사용하다보면 중복된 이름을 가진 심볼이 발생할 수 있습니다. 예제를 만들어서 두개의 framework에 중복된 심볼이 있는 경우 어떻게 동작하는지 확인해보겠습니다. 1. Dynamic library test 먼저, Framework1.framework를 생성하고 MyClass1과 TestC 파일을 아래와 같이 생성합니다. // TestC.h #ifndef TestC_h #define TestC_h #include < stdio . h > extern void CommonTestFunc ( void ) ; #endif /* TestC_h */ // TestC.c #include "TestC.h" void CommonTestFunc ( void ) { printf ( "Framework1에서 CommonTestFunc가 호출되었습니다.\ns" ) ; } // MyClass1.h # import < Foundation / Foundation . h > @interface MyClass1 : NSObject - ( void ) execute ; @end // MyClass1.m # import "MyClass1.h" # import "TestC.h" @implementation MyClass1 - ( void ) execute { CommonTestFunc ( ) ; } @end 이번에는 Framework2.framework를 생성하고 MyClass2와 TestC파일을 생성합니다.

1. Framework: framework란?

이미지
1. Framework: framework란? 이번 포스트에서는 iOS 앱을 개발할 때 외부라이브러리로 많이 이용하는 형태인 framework에 대해서 알아보겠습니다. Framework란? framework는 이미지, nib파일, 다국어 문구, 문서, 공유 라이브러리리, 헤더 파일 등을 포함하는 디렉토리입니다. framework의 목적은 code와 resource를 재사용하는 것입니다. static library(.a파일)는 코드만을 공유하지만 framework는 이미지 파일 및 다국어 파일 등 리소스 파일과 헤더파일을 framework 하나로 공유할 수 있습니다. framework는 또한 bundle이며 NSBundle로 접근할 수 있습니다. 다른 bundle과 다르게 finder에서 보통의 디렉토리 처럼 바로 접근할 수 있습니다. 주요 특징 framework는 관련된 항목을 하나로 묶어줍니다. framework는 static library보다 다양한 리소스 타입을 포함할 수 있습니다. 예를 들어 관련된 헤더 파일과 문서를 포함할 수 있습니다. 여러 버전의 framework를 하나의 bundle에 포함시킬 수 있습니다. 이 점은 오래된 프로그램에서 안정성을 가질 수 있도록 만듭니다. (macOS) Note: framework는 실행코드 없이 리소스 파일만 포함할 수도 있습니다. 그러나 이 방식은 일반적인 사용이 아닙니다. 이런 경우는 프로젝트 생성시 bundle로 생성할 수 있습니다. 구조 MyFramework.framework/ Modules/ module.modulemap Headers/ MyFramework.h MyFramework Resources MyFramework.framework의 디렉토리 구조는 위와 같습니다. MyFramework.framework 디렉토리 아래에 Modules와 Headers 서브디렉토리

Scalar type은 Objective-C로 전달되면 어떻게 될가?

이미지
Scalar type은 Objective-C로 전달되면 어떻게 될가? Objective-C에서 Collection 객체를 사용할 때 scalar type은 값으로 바로 사용할 수 없습니다. NSValue나 NSNumber를 이용하여 값을 객체로 만들어 저장할 수 있습니다. 그에 반해 Swift에서는 scalar type을 값으로 설정할 수 있습니다. 만약 swift에서 scalar type을 저장하고 있는 collection 객체를 objective-C에 전달하면 어떻게 될가요? 이번 포스트에서는 swift와 Objective-C사이에 scalar type을 전달할 때 어떻게 동작하지는 알아보겠습니다. 먼저, NSNumber와 NSValue에 대해서 알아보겠습니다. NSNumber NSNumber는 NSValue의 subclass이며 scalar의 값을 제공합니다. unsigned char, short int, int, long int, long long int, float, double, BOOL을 지원합니다. NSNumber는 collection객체에 scalar type을 전달하기 위해서 사용합니다. collection객체는 객체만 저장할 수 있기 때문에 scalar type은 저장할 수 없습니다. 즉, NSNumber는 scalar type을 저장하고 있는 wrapper객체입니다. NSValue NSValue는 scalartype을 저장할 수 있는 객체입니다. 포인터 주소, 구조체 등을 저장할 수 있습니다. collection 객체나 키-벨류 코딩 등 객체가 사용되어야할 위치에 scalar type을 전달하기 위해서 사용합니다. 지금부터 swift에서 cocoa touch library(Objective-C라이브러리)에 값을 전달할 때 어떻게 동작하는지 확인해보겠습니다. 아래 예제는 CIFilter를 이용하여 이미지의 밝기를 조정하는 코드입니다. let ciImage = CII

frame과 bounds를 observe할 때 차이는?

이미지
frame과 bounds를 observe할 때 차이는? UIView의 크기 변화를 관찰하여 임의로 생성한 Layer의 크기를 조정해야하는 프로젝트가 있었습니다. frame에 observer를 추가를 했고 code생성한 UI에서는 잘 동작을 했습니다. 그런데 storyboard에서 제약조건을 추가한 UI에서는 frame의 크기 변화가 관측되지 않았습니다. bounds에 observer를 추가했을 때 bounds의 크기 변화가 관측되었습니다. 왜 제약조건에서는 frame의 크기 변화가 관측되지 않을지 궁금했습니다. 이번 포스트에서는 frame과 bounds에 대해서 알아보고 각각에 대해서 관측했을 때 어떤 점이 다른지 확인해보겠습니다. frame frame은 부모view에 의해 조정되는 view의 위치와 크기를 표현하는 사각형입니다. view의 위치와 크기를 조정하기 위해서 설정할 수 있습니다. view의 center값 조정 시 origin point가 변경되고 bounds값에 의해 size가 변경될 수 있습니다. 경고 transform이 identity가 아니라면 frame은 정의되지 않으며 그렇기때문에 해당 값은 무시해야합니다. 경고의 의미가 무엇인지 코드를 통해 확인해 보겠습니다. let view1 = UIView ( frame : CGRect ( x : 80 , y : 120 , width : 100 , height : 50 ) ) view1 . backgroundColor = . red print ( "view1 frame: \( view1 . frame ) " ) print ( "view1 bounds: \( view1 . bounds ) " ) print ( "view1 center: \( view1 . center ) " ) view1 . transform = CGAffineTransform (