-
210514 - TILTIL/2021 2021. 5. 14. 23:05
SceneDelegate, AppDelegate
ViewController안에 timer라는 속성을 넣기보다 TimerManager라는 객체를 만들고 이 친구와 메시지를 주고받으며 구현해볼까??라는 생각에 Timer를 다시 만드는데 시간을 기록하기위해서는 앱이 Background에 있어도 시간이 기록되어야 했다.
그래서 어떻게 해야 할까 검색하던 중 SceneDelegate에서 해주면 된다는 것을 알고 코드를 작성하는데 문득 이 둘의 차이가 뭐지?? 라고 생각해보니 딱히 답할 수 없어서 공부를 했다.
기존에 사용하던 방식은 SceneDelegate는 iOS 13.0부터 생긴 개념이라 13.0 버전 이하에서 앱을 만들려면 SceneDelegate class 자체를 @available(iOS 13.0, *) 해주고 AppDelegate에서 제일 아래에 있는 application(_:configurationForConnecting:) application(_:didDiscardSceneSessions:) 두 메서드에도 @available(iOS 13.0, *) 해주고 window를 속성으로 넣어주는 거였는데
공부를 하고 나니 왜 이렇게 하는지 알게 됐다.
- iOS 13.0부터부터 하나의 프로세스를 공유하지만 여러개의 UserInterface instances or scene sessions를 가지게 됐다.
- AppDelegate의 UI LifeCycle의 책임은 없어지게됐다.
- 추가적으로 AppDelegate에 Session LifeCycle에 관한 책임을 가지게 됐다.
자세한 내용은 WWDC2019에서 Apple presentation을 보면 잘 설명해준다.
https://developer.apple.com/videos/play/wwdc2019/258/?time=349
Background에 있어도 시간이 기록돼야 하는 문제는 각각 제공하는 Method에서 background로 변할 때 시간을 Notification에 userInfo에 저장하고 foreground에 진입할 때 시간에서 이전 시간을 빼서 timeInterval을 더해주는 방식을 사용했다.
Button Image 바꾸기
쉽게 View에 ImageView를 넣고 button으로 감싼 뒤 ImageView.image를 바꾸면 되지만 button만 있을 때 button의 이미지를 바꾸고 싶었는데 Button.imageView?.image를 바꾸려 하니 바뀌지 않았다.
이렇게 setImage(_:for:_) 메서드를 이용하여 변경하면 된다.
간단간단!
Swift
오늘은 Loop, Control Transfer에 대해서 복습했다.
Labeled statement를 사용할 기회가 없어서 어디에 선언해야 하는지를 까먹었는데 이 기회에 다시 알고 간다!
Loop Statement
- for - in
- Loop Constant
- while
- repeat while
Control Transfer
- continue
- break
- fallthrough
- throw
- return
- Labeled Statement
- label을 어디서 선언해줘야 하나?
- Label: statment 이렇게 선언
Computer Architecture
계속되는 컴퓨터 구조 공부
MIPS CPU가 어떻게 동작하고 성능 향상을 위한 디자인을 어떻게 해야 할지에 대해서 공부했다.
그리고 2진수 16진수에 대해서 복습했다.
Instruction
- 명령어
- Instruction set
- The repertorie of instructions of a computer
- Instruction Set Architecture(ISA)
- The abstract interface between the HW, and the loswest level SW
- Instructions에 정보를 담아 하드웨어에게 준다고 생각하면 된다.
- Application Binary Interface (ABI)
- ISA + OS
- ABI가 같다면 같은 프로그램은 다른 컴퓨터에서 똑같이 실행될 수 있다.
- 예로 인텔(ISA) cpu를 사용하고 윈도우 (OS)를 사용하면 워드 프로그램을 어느 컴퓨터에서든 실행 가능하다.
MIPS
- CPU 중에 하나를 의미하기도 한다.
- 아래에 사용된 예시를 MIPS로 들기로 한다.
Operation
- Arithmetic Operation
- add a, b, c => a gets b + c
- Design Principle1: Simplicity favours regularity
- Regularity makes implementation simpler
- 규칙은 구현을 간단하게 만든다라는 의미
- Design Principle2: Smaller is faster
- 작을수록 빠르다
- Design Principle3: Make the common case fast
- 자주 사용하는것을 빠르게 만들자
- Design Principle4: Good design demands good compromises
- Register Operands
- 산술 연산은 register operands를 사용한다.
- $t0, $t1 …. Temporary value
- $s0, $s1 … Saved variables
- Memory Operands
- To apply arithmetic operations
- 메모리의 값을 register로 로드해야 한다.
- register의 저장된 값을 메모리에 저장시킨다.
- lw 명령어 == load word (word는 4 byte를 의미)
- sw == store word
- 메모리에서 가져온다는 말
- To apply arithmetic operations
- Register vs Memory
- 메모리보다 레지스터가 더 빠르다.
- MIPS는 Load - Store Architecture
- 메모리에 직접 값을 가져오지 못하고 레지스터를 통해서 load store 해야한다.
- Immediate Operands
- 레지스터 + 레지스터가 아닌 레지스터 + 상수와 같이 상수를 사용하게 된다.
- 레지스터를 사용하지 않고 상수를 사용하니 load instruction을 사용하지 않아서 더 빨라지게 된다.
- 예를 들어 복사를 하려면 add $t2, $s1, zero와 같이 이미 정해놓은 상수를 사용
- Logical Operation
- Conditional Operations
Unsigned Binary Intergers
부호가 없는 정수
Signed는 2s-Complement를 사용하게 된다. (2의 보수 방식)
Sign Extension
- 부호가 sign bit에 의해 결정되므로 1byte -> 2byte로 확장될 때 수를 표현하는 방식
- Unsigned라면 0으로 채우면 되고
- Signed라면 sign bit로 채우면 된다.
Hexadeciaml
- 16진수
- 0 ~ 9 a ~ f
728x90'TIL > 2021' 카테고리의 다른 글
210519 - TIL (0) 2021.05.20 210518 - TIL (0) 2021.05.19 210513 - TIL (0) 2021.05.14 210512 - TIL (0) 2021.05.13 210509 - TIL (0) 2021.05.10