@objc 란,

objective-c에서 스위프트로 선언된 클래스, 메소드, 밸류 프로퍼티 등을 참조하고 싶을 때 @objc 프로퍼티를 지정해 주면 된다.

기존에 만들어진 어플에 스위프트로 작업하고 있기 때문에 @objc 프로퍼티를 쓸 일이 잦은데 swift4 부터 @objcMembers 라는 프로퍼티가 생겼다.

기존의 @objc와 다른 점이 무엇인가 찾아보니 다음과 같이 명시되어 있다.

When a Swift class introduces many new methods or properties that require behavior from the Objective-C runtime, use the @objcMembers attribute in the declaration of that class. Applying the @objcMembers attribute to a class implicitly adds the @objc attribute to all of its Objective-C compatible members. Because applying the @objc attribute can increase the compiled size of an app and adversely affect performance, only apply the @objcMembers attribute on declarations when each member needs to have the @objc attribute applied.


@objc는 파일 사이즈와 성능에 영향을 준다니 @objcMembers로 쓰지 않을 이유가 없다.

단, @objcMemebers는 클래스에만 사용할 수 있기 때문에 특정 method나 프로퍼티만 공유하고 싶을 땐 @objc 그대로 사용하면 된다.

이왕이면 전부 Swift로 바꾸고 싶지만 당분간만 유지하기로 해...

캐시 할 때는 당연히 NSCache를 썼는데 왜 쓰는지에 대해 깊게 생각하지 않았었다.

이전에 했던 프로젝트 중에 NSDictionary로 캐시 구현한게 있길래 구체적으로 차이점을 짚어 보려고 한다.


결론부터 말하면 딕셔너리보다는 NSCache 가 더 유용하다.


1. NSCache는 메모리 관리가 기본적으로 제공된다.

다른 앱에서 메모리를 더 사용하려고 하면 캐시되어 있던 데이터를 지우고 메모리를 해제한다.


2. NSCache는 Thread-safe 하다.

캐시 데이터를 읽고 쓰고 지울때마다 따로 lock을 해줄 필요가 없다.

반면 NSDictionary는 Threadd-safe 하지 않기 때문에 데이터 접근할 때 따로 처리해줘야 한다.


3. NSDictionary는 Key 값을 copy하지만 NSCache는 retain 카운트만 증가 시킨다.

복사를 지원하지 않는 객체까지 포용한다.



[ 관련 클래스 ]


NSDiscardableContent

객체를 더이상 사용하지 않을 때 바로 메모리 해제할 수 있는 메소드가 정의되어 있는 프로토콜


NSPurgeableData

NSMutableData를 상속받으며 NSDiscardableContent 프로토콜이 구현되어 있음



* 참고문서 : https://developer.apple.com/documentation/foundation/nscache


크롬만 쓰다보니 사파리에 무지하다.

플젝 웹뷰 디버깅 얘기하다가 사파리도 가능하다는 정보를 입수.


사파리 설정에서 마지막 탭에 개발자 도구 체크박스로 켜고

휴대폰 사파리 설정에서 웹속성 켜면

웹뷰디버깅 가능!!


그러나 나는 크롬빠라 쓰진 않을 듯;;


***사파리 설정 외에 프로젝트에도 설정 추가해야 사용할 수 있음.

[preferences setValue:@YES forKey:@"developerExtrasEnabled"];



p.s 이건 ㅈㄴㄱㄷ 얘기 나온 웹 디버깅 툴

https://www.telerik.com/fiddler

+ Recent posts