*** 방문한 곳도 있지만 블로그나 인스타그램 정보를 참고하므로 방문 전에 확인 필수!!!


위치

상호명

주종목

코르크차지 조건

참고사항

신논현

북해도목장

양고기

무료

금요일만 1만원

논현역

제이피셰프다이어리

이태리

무료

역삼역

카이수산

해산물

5만원당 1병무료

 이외 병당 만원

양재

로스옥

육류

무료

강남/역삼

스시츠루

일식

무료

잔없음

청담

피양옥

무료

잔없음

마장동

한우촌

무료

논현

육화몽

돼지고기

무료


칠백식당

소고기

무료


삼다옥

돼지고기

무료

 

 경천애인2237

 

 무료

 

 

 우미학

 

무료 

 

판교

빈티지1988

퓨전이태리

무료

판교

차알

중식

무료

판교

케르반

터키

무료

맥주잔 제공

강남

먼데이블루스

무료


 

 모단걸응접실

 

무료 

 

한남동

세미계

조건부무료

정자

하누비노

무료

투뿔등심

무료

 한남동

한와담 

 

 무료

 

도산대로

바랗 

 

 무료

 

압구정

저스트스테이크

800g 이상 주문시 무료

서초

육갑식당

무료

서래마을

퀸즈파크

무료

압구정

플레이트썲

무료

영등포

최우영수산

무료

교대

교대수산

무료

예약불가

언주역

일일향

중식

유료

판교/한남동

진1926

양갈비

무료

단관용스크린있음

마포

락희옥

무료

정자

에이컷스테이크

무료

캐주얼

이수역

이수회관

해산물

무료

성수

참치동생

무료


 도쿄등심

 

 무료

이태원

소설옥

무료

강남

나폴리회관

조건부무료


신사

네모집

무료

서초

아이모 에 나디아

무료

강남

카페무라노

무료

압구정

앙스모멍

무료

노량진

운봉산장

양갈비수육

무료

잔없음

신사

따뚱

중식당

무료

홍대

퀴진 라따뚜이

무료

판교

송추가마골

무료

판교

대게나라

무료

역삼

보나베띠

무료

한남동

한남북엇국

무료

맥주잔

양재

자맛풍

테이블당 1병 무료

선릉/역삼

재패니즈다이닝 안심

병당 만원

서래마을

라모라 

 

무료 

 

역삼

곱창싸롱

잔당 5천원

 이태원

피아프 

 

무료 

 

 이태원

오누 

 

무료 

 

판교

스시혼

테이블당 3만원

홍대 

램스일레븐 

 양고기

무료 

 

 

와인주막차차 

 

무료 

 

 

사랑의고기 

 

 무료

목동 

 일미락

 

 무료

 

압구정 

피쉬스토리 

 

 무료

 

논현 

 마켓오

 

무료 

 

 삼성

 길목

 

무료 

 

 

 크레아

 

무료 

 

 신사

김수사 

 

코스 주문시 무료 

 

 

차움 레트로아 

 

무료 

 

 강남

고깃집 열 

 

2인에 1병 무료

 

 정자

가감정육식당 

 

무료 

 

신사 

천미미

 

잔1개 무료/추가는 잔당 5000원 

 

판교 

스시쿤 

 

병당 2만원 

 

논현

백린 

중식 

코스 주문시 무료 

 

 압구정계식당  병당 만원  
 모퉁이우  

무료

 예약제

청담

고수 

 

무료

 

청담

한아람 블랙라벨  

무료

 
 

양바위

 

무료

 

 강남/삼성

고메램 

양고기 전문 

병당 1만원 

 


@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

iOS9 부터 AddressBook framework 가 deprecated 돼서 CNContact framework 를 사용하게 됐다.

그런데 시작부터 문제가 스물 스물 발생. 그 중 대표 이슈만 정리해 본다.


#1 NavigationBar is hidden on CNContactViewController for Unknown and it never shows up again.


이 문제는 전세계 ios 앱 개발자에게 깊은 빡침을 선사했다.


[CNContactViewController viewControllerForUnknownContact:] 로 호출된 vc에서 연락처 공유 / 기존의 연락처에 추가 등의 메뉴를 선택하면 새 화면이 present 로 뜨면서 앱의 네비게이션바가 hidden 된다. 그리고 이 화면을 dismiss하면 기존의 네비게이션바가 나타나야 하는데 보이지 않는다.

AddressBook에선 잘 됐는데.. 에헤이 이 사람들 일을 하다 말았넹..


이전 화면으로 돌아가기 위해선 앱을 재 실행하는 수밖에 없다. ㅠㅁㅠ


작년 WWDC 에서 (따지는 표정으로)물어볼 겸 찾아갔는데 contact 프레임웍 유닛을 만날 수 있는 시각을 오해해서 이미 집에 가고 없었다. 안돼 ㅠㅡㅠ 

그래도 다른 파트 사람한테 설명해주고 프레임웍에 무슨 문제가 있는지 같이 확인 후 연락기다리겠다고 하고 헤어졌는데 iOS10이 릴리즈됐을 때도 변화 없길래 걍 포기.


올해에 커스터마이징 해야지 하고 있었는데 오옷!!

어제 확인해보니 언제 수정됐는지도 모르게 정상동작한다. 단, iOS 10 이상에서만.

애증의 애플... 이런 기본적인 기능은 잘 구현해줬으면 좋겠다.



// NOTICE:  I realized navigationbar hidden issue has fixed for iOS10 only.



#2 CNContactViewController를 push 했을 때 발생하는 UI 문제.


View의 좌측 끝 부분 터치가 안된다. 하지만 모달로 구현하면 잘 동작해서 의아함. 



#3 Left button is disappeared after selecting menu on Unknown ViewController


문제가 발생하는 동선은 다음과 같다.

1. 좌측에 닫기 버튼 나오도록 세팅하고 모달로 띄움.

2. 새 연락처로 등록으로 들어가 완료 버튼 누르면 화면이 닫히면서 네비게이션바가 나타남. 

3. 우측에 파란색 편집 버튼이 생기는데 좌측에 넣었던 close 버튼이 사라짐.

=> 10.2 이상에서는 닫기 버튼이 살아있으나 오른쪽 편집 버튼 파란색인 현상은 그대로임.


뭔가 동작이 이상한데 unknown 뷰의 메뉴를 선택하고 닫을 때 이벤트를 받을 수가 없다.

편집 버튼이 나타나면서 이상해지길래 allowsEditing = NO 로 세팅했더니 편집 기능을 사용할 수 없지만 네비 바의 버튼들이 이상해지는 문제는 막을 수 있다.

이 완벽하지 않은 해결에 찝찝해하며 일단 이 이슈는 여기까지 정리하는 걸로!!

매년 여행을 갈 때면 오랜 시간 준비하지만 마지막은 대충 여유부리기 일쑤다.
아니나 다를까, 이번에도 한달이란 긴 시간을 처음으로 나섰는데 어설픈 준비에 고생 고생했다.

혹시라도 누군가에게 도움이 될까 짧게 기록해 본다.

1.여행 기간
- 2016년 9월 24일 새벽 출국 ~ 2016년 10월 24일 오후 귀국

2. 방문지
- 파리 / 뮌헨 / 그린델발트&체르마트 / 잘츠부르크&빈 / 프라하&체스키크롬로프 / 브라티슬라바 / 부다페스트 / 이스탄불

3. 여권
- 메인 아이템 여권!
보통 여권사본을 가지고 가지만 박물관 오디오 가이드를 대여할 때 여권을 맡겨야 해서 사본보다는 원본을 항상 소지해야 했다. 숙소까지 돌아가기 힘들어서 일정을 변경하거나 가이드 없이 다니기도 했는데 아주 불편하다.ㅠ

4. 비자
- 이번에 방문하는 모든 곳은 비자 불필요

5. 여행자보험
- 짧게 다닐 때는 보험을 굳이 들지 않지만, 장기 일정인데다 체코에서는 여행자 보험일 필수라고 하여 영문 버전으로 프린트해 감. 검사하는 일이 일어난 걸 본적은 없다고 하나 카메라에~ 휴대폰에~ 가격도 그리 비싸지 않으니 하나 들어가는 것이 좋은 것 같다.

6. 환전
- 큰 돈 들고 다니는 게 불안해서 일부만 환전해가고 나머지는 비바체크카드로 인출하거나 씨티 신용카드로 결제


7. 항공권
- 1월 경 카타르항공 프로모션에서 다구간 인천-파리, 이스탄불-인천을 약 70만원에 예약함
- 저렴한만큼 취소 또는 변경 수수료가 왕복 항공권 가격보다 큼, 카타르 항공은 저렴한 편이라 이른 프로모션이 아니더라도 비슷한 가격에 구매할 수 있는 것으로 보임

8. 숙박
- 유럽 물가는 너무 비싸다. 숙소는 깔끔하고 물 잘나오고 위치 좋고 잠만 잘 것이므로 호스텔 위주로 선택했다. 리뷰를 보고 베드버그나 엘리베이터 유무, 치안 상태 등을 체크했다. 대부분 괜찮았지만 가끔 리뷰를 덜 봐서 개고생함

9. 교통
- 각 도시의 시내 교통권은 판매기가 있고 구입 방법도 비슷함
- 환전해 가지 않은 경우 공항이나 기차역에 대체로 카드 이용 가능한 판매기가 있으나 아닌 경우도 있으니 잘 알아볼 것
- 도시간 이동 수단 : 저가항공, 스위스 패스, 쿠셋, 구간기차, 버스

10. 통신
- 여행갈 때마다 심카드를 구입해서 쓰는데 이번에는 한국 심마켓에서 대여했다. 이동할 때마다 바꿔 끼우지 않아도 되고 가격도 그리 비싸진 않았지만 안 터지는 구간이 많아서 불편했다. 따지고 보면 인터넷이 느려서 많이 사용하지 못했기 때문에 저렴한 가격도 아닌 것 같다. 다음부턴 그냥 현지 심카드를 쓰겠어 ㅋ

11. 해야만 하는 것들 리스트업
- 에펠탑 와인 번개
- 옥토버페스트
- 그린델발트 패러글라이딩
- 오스트리아 공연
- 헝가리 토카이 와인 구입
- 이탈리아 양고기 먹기

12. 주의할 점
- 날씨가 좋을 줄 알고 갔는데 동유럽은 아주 춥다. 겨울 패딩 필수 ㅠㅡㅠ 방수 되는 운동화 필수, 흩뿌리는 비바람을 막기 위해 모자가 달린 옷이 좋다

이슈 : UIAlertController 로 변경되어 alertview를 present 하면서 keyboard 를 닫는다.


presenting을 할 때 키보드를 닫는게 디폴트인듯하다.

이전 정책으론 AlertView 는 다른 뷰에 영향을 주면 안되는 거였는데 어느 순간 오래된 클래스들을 변경하면서 정책들이 바껴서 고생하는게 한두번이 아니다.

커스텀 뷰를 띄우든 모달에 익숙해지든 해야겠다. 다른 앱들은 커스텀으로 많이 옮겨간듯.

커스텀 키보드를 설정한 후 마이 앱에서 커스텀 키보드를 한번 열었다가 메뉴를 전환해서 커스텀 인풋뷰로 스위칭하면 커스텀 키보드가 인풋뷰 위를 덮는다

인풋뷰가 UIView 면 발생하지 않으나 UIViewController 인 경우 시그널을 받는건지 키보드가 자연스레 올라온다


이런 젠장

하루하루 풀어나가야 할 버그는 늘어만 가는데 해결되는 건 없구나...


AppDelegate api 중에

   - (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier 

가 있는데 키보드를 열때마다 호출된다. 


여기서 extensionPointIdentifier 가 UIApplicationKeyboardExtensionPointIdentifier인 경우 NO를 리턴하면 커스텀 키보드가 실행되지 않는다.


버뜨!!

내가 원하는 건 특정 상황에서만 사용하지 않는 것이므로 조건을 주어 처리. 해결해보리라.







What : 

앱스토어에 섭밋하는 과정에서 앱아이콘 관련 에러가 발생한다. 

이름이 이상하다는 내용이 떠서 처음엔 이름을 계속 변경해봤으나 같은 에러만 연달아 발생했다. 

구글링하다가 드디어 원인 발견!!


Why : 

Watch OS 1을 사용했을 때 추가된 App Icon assets 이기 때문에 Watch OS 2 에서는 불필요한 이미지가 존재한다. 

그것이 바로 App Icon 44 X 44 사이즈이다. (Long Look size)


이 이미지를 지우고 빌드해서 다시 섭밋하면 에러는 사라진다. 

하지만 우린 아직 WatchOS1 과 WatchOS2를 모두 지원하기 때문에 언제까지 유지해야 하나 고민 중이다. 

WatchOS1 을 사용하는 유저가 소수지만 존재하기 때문에 지우는 김에 앱 아이콘 옵션도 변경해야겠다.


해당 파일을 그냥 지우면 App Icon Asset 세팅이 예전 그대로이기 때문에 파일이 없다고 경고한다.

그래서 다음 과정에 따라 옵션을 변경하면 asset 환경을 OS2 용으로 설정해서 44x44 이미지는 unassigned 로 바뀐다.


Watchkit app bundle > Assets.xcassets > Select AppIcon.appiconset in Xcode7

Xcode 우측에 utilities section 에서 3번째 버튼을 선택하면 App Icon 설정에 Apple Watch 항목에 'watchOS All Versions' 와 'watchOS 1.0 Specific' 이 존재한다.





해당 화면에서 'watchOS 1.0 Specific' 을 Uncheck 하면 된다.




RecordID 는 int 타입인데 새로 생긴 contact framework 에서는 identifier 타입이 NSString이다.

이럴수가...

이왕이면 관련 api가 오픈되어 있길 바랬으나 과거의 코드를 가져오는 걸 싫어하는지 recordID 로 contact를 fetch 할 수 있는 api는 private 으로 선언되어 있다.


기존의 함수형에서 objective-c / swift 에 걸맞게 객체형으로 변환한 것까진 좋은데 어째 영... 불안정한 느낌이다.


나름 고민하다가 조언을 받아 두 ID 사이에 연결고리가 없으니 마이그레이션으로 contact를 새로 쭉 끌어오기로 결정했다.


참고 URL : https://forums.developer.apple.com/thread/7063

+ Recent posts