SwiftUI에서 뷰 디버깅

따따디씨 보다가 좋은 코드를 봐서 메모..

expression Self._printChanges()

뷰가 왜 불렸는지 알고싶을때 lldb 디버그 콘솔에서 저 명령어를 치면 된다

코드상에서도 저 메소드를 부를수는 있지만 프라이빗 API라서 리얼에 나가지 않도록 조심하라고 한다

요건 푸드트럭앱 샘플에다가 명령어를 쳐본 결과

같은 화면을 스크롤 했을때 같은 명령어를 쳐보면 설명이 바뀐다

그리고 저걸 보고 궁금했던건 나는 그동안 p, po만 쳤는데 expression은 무엇인가 …

찾아보니 결국 같은 명령어라고 봐도 될듯

p 는 expr —

po 는 expr –O —

expr은 expression 명령어의 줄임, e로도 쓸 수 있다.

더 궁금하면 LLDB: Beyond “po”를 보라는데, 나중에 보자아..

참고

[iOS] APNS http/2 지원 API 공개

클라이언트 보다는 서버쪽에 관련된 이야기이지만, http/2 를 지원하는 push api가 공개되었다는 뉴스가 올라왔다.

덕분에 관련 wwdc를 좀 봤는데, http/2를 소개하기를 한 커넥션으로 request와 response를 여러 개 받을 수 있게 된다고 한다. 스트리밍과 비슷한건지 그렇게 비유를 해줬다.  그리고 여러개의 request 중 한 놈이 실패를 하더라도 커넥션은 살아있다고 한다. 클라이언트 쪽에서만 보면 http/2를 위해 따로 대응을 안해줘도 되는 것 같은데, 과연 그럴지 ..

 

덤으로 APNS 쪽에서 새로워진 점은 payload 사이즈가 4kb로 또 늘어나고, device token 길이도 길어진다. silent notification은 앱을 깨우는 형태로 동작하는거 같은데, 동작하는 타이밍은 os단에서 결정하는 모양이다.  apns feedback 서비스도 소개했는데, 이건 다시 알아봐야 할 듯 싶다.

 

 

 

 

[iOS] WWDC 노트 – Adopting Handoff on iOS and OS X

Hand off는 이번에 발표한 새 기능인데, PC랑 iOS기기 사이에 파일같은 데이터를 주고 받을 수 있게 된 기능으로 오매불망 기다리고 있었던 기능이다 :$

Hand off를 사용할 수 있는 환경이 되면, 밑의 그림처럼 왼쪽 밑에 표시가 나타난다.

1

혹은 홈버튼 두번눌렀을 때도 표시가 나타난다.

2

PC의 경우 메일아이콘 보면 오른쪽 밑에 표시가 있다.

3

NSUserActivity

NSUserActivity는 Handoff를 위한 객체로, 맥이랑 ios에서 같은 object를 쓴다.
이 객체 패키지를 보내면 알아서 기기에서 받아주고 보내고 한다.
그리고 네이티브 앱과 웹사이트 사이에도 이 객체를 주고 받을 수 있다. 웹사이트 보다가 좋은거 발견하면 기기로 휙 보낼수 있당

이제 NSDocument, UIDocument 같은 애들이 UserActivity를 가지고 있게 된다.

5

becomeCurrent 라는 delegate 메소드가 불리면 (스스로 부를수도 있지만 그럴 필요는 없다) 주변 기기에 알린다. 그럼 기기 밑에 handoff 표시가 뜬다.

6

근데 UIDocument는 자동으로 becomeCurrent를 부르지 않는다고 한다.

7

invalidate는 일할 것이 끝났다는 뜻. (기기들에 hand off표시가 사라지고 윈도우를 닫고 할거다.)
NSUserActivity는 userInfo Dictionary를 가지고 있다. userInfo 는 매번 비워진다고 한다.

userInfo는 아래같이 쓸 수 있다.

8

UserInfo에 대부분 넣을수 있는데 FileUrl은 좀 문제를 야기할수 있다고 해서, UserInfo는 최소의 정보를 담도록 하는게 좋다.(상태 같은거)

9

위는 정보 가져오는 예시 코드

같은 developer이 만든 앱끼리 activity를 교환 가능하다.

결국 팀 아이디가 같아야 한다는 건데, UIPaseBoard와 비슷한 경우라고 보면 될 거 같다.
참고 : https://byunsooblog.wordpress.com/2013/10/12/ios-uipasteboard-%EC%9D%B4%EC%8A%88-ios7/

앱들끼리 같은 actvity 타입일 필요가 없다. 밑에 예시를 보면 os x랑 ios랑 다른 타입이다.

10

케이스에 따라 delegate 메소드가 꽤 있는데, 불리는 타이밍은 시스템이 activity가 필요할때 부르는 메소드, 다른 기기에서 activity가 이어서 진행된다던가 할때 등이 있다고 한다.

웹페이지도 hand off 지원

web page url을 채우면 이어서 보여주는 듯 하다. (기기 -> 맥의 웹페이지 가능)

맥의 웹페이지 -> ios기기로 보여주려면 info.plist에서 도메인을 채우면 된다.

11

그리고 delegate 메소드를 구현하면 된다.

12

Continuation Streams

그리고 막판에 소개한 내용인데, 맥이랑 기기랑 이어서 보여주는 걸 스트리밍으로 지원할수 있다고 한다.

참고 :https://developer.apple.com/videos/wwdc/2014/

[WWDC] Advances in Objective-C 후반

후반에서는 Objective-C 문법이 변한 부분에 대한 내용이 많았다.

1. Modernization

Xcode 리펙토링부분에 보면 최신 Objective-C 문법으로 변환해주는 기능이 있는데, 이걸 설명하면서 최신 문법에 대한 설명이 있었다.
refactor

Modernize에서 커버해주는 기능이

  • Object literals
  • Container literals
  • Subscripting

이 있고 더 자세한 내용은 WWDC 2012년 405를 보라고 한다.

여기서 literal이라 함은

[NSArray arraywith...] -> @[]
[NSNumber numberWith...] -> @1988

이런 식으로 간단하게 변한 부분을 말하는 것 같다.

Container는 Dictionary와 Array에 해당하는 부분 같은데,

Dictionary


[_dict objectForKey:@"key"] -> _dict[@"key"]
[_dict setObject:arg forKey:@"key"] -> _dict[@"key"] = arg;

Array


[_array objectAtIndex:0] -> _array[0]
[_array replaceObjectAtIndex:0 withObject:tmp] -> _array[0] = tmp

이렇게 변한부분을 말한다.

2. SDK Improvement

Xcode에서 실수하기 쉬운 부분을 오류로 잡아주는 부분이 향상됬다고 한다.

instancetype

리턴타입 에러 잡을 때 (NSDictionary 리턴해야 하는데 NSArray 리턴하는 경우) 예전에는 id가 리턴타입이어서 에러를 못잡았는데 이번엔 instancetype으로 바꼈다.


+ (instancetype)array;

instancetype은 리턴 타입을 위한 용도로 쓰인다.
만약에


dictionary *dic = [NSarray array]

이러면 array 리턴 타입이랑 dic 타입이 다르니까 오류 메세지를 띄우게 된다.

Explicitly-Typed Enums

예를 들어

NSURLHandleStatus status = NSURLSessionTaskStateRunning;

이러면 예전에는 enum이 int 였으므로 오류표시가 안난다. 개인적으로 이런 식의 실수를 은근히 했었다..

Before


enum {ABC,JKL, XYZ};
typedf NSUInteger MyEnum;

After


enum MyEnum : NSUInteger {ABC,JKL, XYZ};
typedf MyEnum MyEnum;

그 외의 워닝

예를들어


if () return NSURLHandleStatus;
else if () return NSURLSessionTaskStateRunning;

이런식으로 앞의 리턴과 뒤의 리턴타입이 다르면 에러 보여주게 변경됬다.

3. ARC 성능

맥에서 가비지 컬렉션을 없앨 모양인가보다. 새로 추가되는 API들은 ARC를 쓰도록 구현되었다고 한다.
그리고 __weak refernce가 iOS7.0이랑 OSX 10.9에서 거의 2배 빨라졌다고 한다.

ARC Migrator

migrator가 대부분은 해주지만 직접 해야하는 것도 있다.
migrator은 refactor 메뉴에서 찾을 수 있다.

 

arc

 

migrator가 해주는 것

  • retain/release/autorelease 삭제
  • 빈 dealloc 메소드 삭제
  • NSAutoreleasePool을 @autoreleasepool로 변환

그 외의 해야 하는 부분

 

  • 구조체에 있는 “id”
    • 이게 가능한지 몰랐다.. 찾아보니 id 타입이 C 언어에 정의되어있다고 한다. ( /usr/include/objc/objc.h )
  • 메모리 관리 API 사용하는 부분

CoreFondation and ARC

CFBridgingRetain()하면 카운트가 1 오르고, CFBridgingRelease()하면 카운트가 1 줄어든다.
그리고 __bridge로 캐스팅하면 카운트가 그대로라 실수를 줄일 수 있다.

보통 CF 함수들은 “..create()”와 ..copy..()” 같은 것들은 카운트 1을 늘린다.
그 외의 것은 카운트가 그대로이다.

예외상황을 위해서 CF_RETURNS_RETAINED, CF_RETURNS_NOT_RETAINED, CF_RELEASES_ARGUMENT가 있다.

이번에 추가된 것은 위의 내용들을 암시적으로 bridging하는 것이 허용됬다.
사용방법은 CF_IMPLICIT_BRIDGING_ENABLED, CF_IMPLICIT_BRIDGING_DISABLED 이 둘 사이에 암시적으로 쓰는 내용을 넣으면 되는 것 같다. 아래는 예제이다.

 

#include <CoreFoundation/CoreFoundation.h>

CF_IMPLICIT_BRIDGING_ENABLED

EXArrayRef EXFooCreateCopy(…);
const void *EXFooGetValueAtIndex(EXArrayRef theArray, CFIndex idx);
const void *EXFooRandomPlusOne(EXArrayRef theArray) FC_RETURNS_RETAINED;

CF_IMPLICIT_BRIDGING_DISABLED

 

IMPLICIT 블락이 내에서 FC_RETURNS_RETAINED를 추가한 이유는 이름 보고 정확히 retain을 해야할지 카운트를 그대로 둬야할지 헷갈려서 쓴거라고 했던 것 같다..

[WWDC] Advances in Objective-C

최근에 다시 보기 시작한 WWDC.. 그 중 Objective-C에서 추가된 부분을 보고 있는데 알면 좀 편해질만한게 있다.

새로 추가된건 @import

컴파일 타임이 원래 m파일 * h파일 만큼 늘어나는데 프레임워크를 모듈화해서 컴파일 타임을 줄였다고 한다… @import를 쓰면 그렇게 알아서 되는 모양이다.
그리고 @import 하면 이제 관련된 프레임워크를 오토링크 해줘서 컴파일 에러 “link binary with libraries” 가 안난다고 한다.

예를 들면 iAd를 @import해서 컴파일 하면 iAd 프레임워크가 자동으로 링크된다는 식이다.

쓰는 방법은

@import iAd.ADBannerView;

이게 #import <iAd/ADBannerView.h> 와 비슷하다.

그래프를 보여주면서 설명한 장점은 빌드, 인덱스 타임이 줄어든다는 내용.. 편하긴 할 것 같다.

기존의 있었던 프로젝트를 @import를 사용하게 하고 싶으면, 빌드 세팅에서 옵션을 선택하면 자동으로 #import랑 #include를 변환해준다.

세팅에서 선택하는 방법

module