본문 바로가기

iOS/Swift72

Swift) 순환 참조 , strong, weak 순환 참조란 순환 참조란 여러 클래스 인스턴스가 서로간에 강한 참조상태(Strong Reference)를 가질 때 발생하고, 순환 참조가 발생하게되면 서로간의 참조가 해제되지 않기때문에 메모리 누수(Leak)가 발생할 수 있다. 순환 참조 예 class Person { var name: String var puppy: Puppy? init(name: String) { self.name = name } deinit { print("Person deinit") } } class Puppy { var name: String var owner: Person? init(name: String) { self.name = name } deinit { print("Puppy deinit") } } var john: P.. 2022. 2. 13.
Swift) ARC ARC ARC는 Automatic Reference Counting의 약자이다. 레퍼런스 카운트를 자동으로 해준다고 이름에서 바로 알 수 있다. ARC의 이름..의 좀 더 깊은.. 뜻을 알기위해 ARC가 있기 전에 있던 방식을 알아보자 ARC 이전엔? ARC가 있기 전엔 MRC(Manual Reference Counting)라는 것이 있었다. MRC도 마찬가지로 MANUAL이란 이름에서 알 수 있듯이 레퍼런스 카운트를 수동으로 해주었다는 것을 알 수 있다. retain, new, alloc등을 사용해 레퍼런스 카운트를 올리고, release 등을 사용하여 레퍼런스 카운트를 내려 레퍼런스 카운트가 0이 되면 클래스 인스턴스를 deinit 시켜줬었다. ARC는 그럼 뭔데요 MRC 방식은 RC를 언제 올려주고.. 2022. 2. 13.
Swift) Protocol(1) 프로토콜? 특정 기능, 역할을 하기 위한 프로퍼티, 메소드, 기타 요구사항 등의 청사진 프로토콜 준수, 채택 구조체, 클래스, 열거형은 프로토콜을 채택하여 특정 기능, 역할을 하기위한 프로토콜의 요구 사항을 실제로 구현할 수 있다. "청사진" 이라는 의미에 걸맞게 정의를 하고 설계도만 제공할 뿐 스스로 기능을 구현하지는 않는다. 구현은 프토토콜을 채택한 구조체, 클래스, 열거형에서 구현한다. 프로토콜 구문 protocol 프로토콜명 { //기능 정의 } 프로토콜을 채택하려면 사용자 정의 타입 뒤에 콜론을 붙이고 프로토콜명을 위치시킨다. 프로토콜이 여러개일 경우, 콤마로 나열할 수 있다. 클래스의 경우, 상속받은 superclass가 있다면 나열된 목록의 제일 앞에 위치시켜준다. struct 구조체명: 프.. 2022. 2. 13.
Swift) removeAll() vs [] 시간복잡도, 효율성을 따지다가 removeAll()과 []은 뭐가 다른건가 생각이 들었다. !!!!!!!!!!!!!!!!!!!! 근데 보면 default가 false이다. 만약 keepingCapacity로 true를 넘겨준다면 요소는 제거하지만, 메모리는 제거하지 않는다. 내 생각엔 이것 같다. true를 넘겨줘 메모리를 남겨둔다면 complexity가 O(n)인 것이고, 기본값 false이면 아닌 것 아니 아무리 생각해봐도 그냥 가차없이 다 지워버리는건데 차례대로 지우는 것도 아니고 검색을 하는 것도 아니고.. 그래서 의문을 가졌었다. 내가 내린 결론은 []를 저장해 빈 배열로 만들던, removeAll()을 쓰던 상관이 없다. 이다. 궁금한 분이 계시다면 밑글을 한번 읽어보는 것도 좋을 것 같다. .. 2022. 2. 13.
Swift) map map map은 배열 내부의 값을 하나씩 돌며 특정한 타입, 특정한 것으로mapping한다고 생각하면 간단하다. 그리고 그 결과를 배열의 상태로 반환한다. let name = ["Jiseong","Allie","Asan","Zoe"] print(name.map { $0 + " Hi" }) // print ["Jiseong Hi", "Allie Hi", "Asan Hi", "Zoe Hi"] 타입도 변경할 수 있다. let number = [1, 2, 3, 4, 5] print(number.map { Double($0) }) // print [1.0, 2.0, 3.0, 4.0, 5.0] flatMap let mapped = number.map{ Array(repeating: $0, count: $0) } /.. 2022. 2. 12.
Swift) DoubleStack - Queue DoubleStack을 이용한 Queue Queue를 하나의 Array로 만든다면, 첫번째 요소를 제거하려 removeFirst()를 호출할텐데 공식문서를 보면 시간복잡도가 O(n) 인 모습을 볼수 있다. 이는 첫번째 요소가 빠지고 그 뒤의 요소들이 앞으로 당겨지는 과정에서 발생하는 비용으로 인한 것이다. 그래서 그러한 단점을 보완한 DoubleStack 즉, Array 2개를 이용해 단점을 보완한다 하나의 Array에 먼저 enqueue 하여 요소를 넣어주고 dequeue할 때 다른 Array에 reversed()를 이용하여 넣어준다면 첫번째 배열의 첫번째 요소가 두번째 배열에선 마지막 요소가 되기에 dequeue하여 요소를 뺄 때 첫번째 요소를 뺴서 뒤의 요소들이 앞으로 당겨지는 비용이 쓰이지 않게 .. 2022. 2. 12.