OCUnit 에서 UIImage 의 imageNamed:를 호출하면 
메인 어플과 다르게 UIImage Object를 가져 오지 못하고, nil 을 리턴하면서 프로그램이 좌자작 꼬인다. 

왜 이런 문제가 나타나는 걸까 ?

그건 바로 mainBundle이 꼬여 있기 때문이다. 
OCUnit FrameWork 단에서 mainBundle을 OCUnit Product로 변경해줬어야 할것 같은데, 그게 되어 있지 않다. 

그래서 OCUnit에서 Bundle Resource를 사용할때는 [NSBundle mainBundle]을 사용하지 않고, bundleForClass Method를 사용해서 접근하는데, UIImage imageNamed:는 내부적으로 mainBundle 을 호출하기때문에 이를 피해갈 방법이 없다. 

그렇다면 UIImage imageName:를 쓰지 말아야 하는것일까? 
그렇게 해야만 했다면, Blog에 Posting하지도 않았겠죠? ㅎㅎ

아이디어는 Objective-C의 Category 라는 특성을 이용해서 Method만 Override하는것이다.
( 사실 Method Implementation Switch 로 할려고 했는데,, 잘 안되더라고요 :( ) 

그럼 UIImage 의 imageName:을 Override할것인가 NSBundle의 mainBundle을 Override할것인가를 결정해야 하는데,

TestCode내에서 mainBundle말고, bundleForClass를 부르는것도 짜증났기에, 
NSBundle의 mainBundle 을 재정의 하기로 했다.

소스코드는 매우 간단하다.

@implementation NSBundle(OCUnit)


+(NSBundle *) mainBundle {

return [NSBundle bundleForClass:[TestClass class]];

}

@end


여기서 좀 마음에 들지 않는 부분이 있는데, 
Test하고 있는 Class를 참조 해야 한다는것이다.
<주의 ! TestClass의 Class명은 OCUnit내의 Class로 이름을 변경해주어야함 >
 
결국은 bundleForClass를 통해서 하고 있는데, 좀 다르게 깔끔하게 하는 방법을 좀 찾았으면 좋겠다.
아마도 있겠지만, 일단은 흘러가니, 나중에 라이브러리화를 고려할때, 좀더 생각해봐야 겠다.





+ Recent posts