Search

13주차 멘토링

진행 일자
2023/12/14
피드백 여부
피드백 완
이종원
git rebase
[weak self]

멘토링

git rebase

길이 합쳐진다.
re+base
base → 우리가 브랜치를 새로팔때 그 기준이 되는 base
(main), development (결국 합쳐지고 실제 배포할 브랜치)
12월 14일 오후 6시 시점!
종원브랜치 (종원님이 작업) - jbranch
j_commit1
j_commit2
남훈브랜치 (남훈님이 작업) - nbranch
n_commit1
n_commit2
남훈이 main에 병합했다 merge 했다!
n_commit2
n_commit1
main ㅁ———————————————————ㅁ——-—ㅁ
— j_branch commit1 commit 2——————
— n_branch commit1 commit2 commit 10———
충돌이 10개정도 발생함 (conflict)
머지 컨플릭났어 처리해! > 처리하고 add > merge continue > 머지 커밋 메시지 입력하세요! > 머지 커밋 메시지 하나 생기고!

[weak self]

강한참조를 하고 있는 클래스들을 메모리 관리를 위해 약한 참조로 할 수 있게 weak를 씀!

메모리에 대해서! (with. ARC)

ARC라는것이 있음 Swift!
Objective-C
메모리 (객체 인스턴스)에 대해 할당/해제를 할때 delloc / alloc메서드들을 개발자가 직접 코드짜면서 넣어줬어야함 > 수동으로 개발자가 메모리를 해제 할당했다!!
컴파일러가 알아서 잘~ 해줬으면 해
Automatic Reference Counting (자동 참조 계수) → 객체가 참조되고 있는 횟수를 추적하는 계수!
힙 영역의 객체 → 동적 할당 참조를 하는 카운트 (횟수)를 추적해서 객체가 더 이상 필요하지 않을때 (참조하고있는 카운트 횟수가 없을때) 해당 객체에 대한 메모리를 자동으로 해제하는 방식이다!
메모리 관리를 해준다!
class VC {
var a: Model (Model → Class)
deinit {
a의 delloc같은 해제 메서드들을 구현하지 않아도되는것! } }
참조하는 방식
강한참조 (strong Reference)
기본적으로 Swift에서 변수 /상수는 모두 강한참조에요!!!
객체에 대한 강한참조 카운트가 증가되어 있다면, 해당 객체는 메모리에서 유지되요~
class Person { var name: String init(name: String) { self.name = name } } var person1: Person? = Person(name: "Green") // 강한참조 var person2 = person1 // 또 다른 강한 참조! person1 = nil -> person1이 nil이 되더라도 person2가 여전히 person1에 대해 강한 참조를 가지고 있기에 객체는 메모리에서 유지됨!!!!
Swift
복사
→ 사용되지 않는데도 실제 메모리에서 사라지지않고 어딘가에 있다~
→ 이런것들이 무수히 많아짐 → 더이상 메모리를 할당받을 공간이 없어요! → 앱이 터진다~ → 앱이 크래쉬가 난다! (메모리 성능을 저하시키는 하나의 주범)
순환참조되고 있따! (순환참조)
ARC 작동방식 특성상 두 객체가 서로 강한 참조를 하게 되는 경우!!! 순환참조를 일으킨다~~~
두객체가 다 사용이 안되더라도 두객체가 서로 강한참조~ Strong 레퍼런스 카운트 참조계수를 감소하지 않기에 메모리에 계쏙 남는거에요~
이를 위한 해결책으로! 약한참조/미소유참조라는 친구들 등장!
약한참조
강한참조 → 참조 횟수를 증가시킨다~ But 참조횟수 증가 안시켜요!
객체의 생명주기에 영향을 주지않으면서 참조를 유지를 할 수 있음
순환참조 방지
class Person { var name: String weak (unowned) var friend: Person? init(name: String) { self.name = name } } var person1: Person? = Person(name: "Green") var person2: Person? = Person(name: "Red") person1?.friend = person2 person2?.friend = person1 person1 = nil
Swift
복사
미소유참조
미소유참조는 Optional 값이 아니기에 nil로 설정될 수 없다!
메모리에 그 참조하는 대상이 더 오래 살아있을거야! 라고 보장하는경우에~

코드로 보기!! (캡쳐리스트)

코드로 살펴봐요! (weak self)
class AClass { var title: String = "Green" func result() { DispatchQueue.main.asyncAfter(deadline: .now() + .second(3)) { [weak self] in print(self?.title ?? "Green") } } }
Swift
복사
unowned self
class BClass { var bClosure: (() -> Void)? init() { bClosure = { [unowned self(BClass)] in print(self) } } }
Swift
복사
장점! (weak보다 장점!?)
간결할것 같다! 옵셔널바인딩이 필요없다~ (!)
struct AStruct { var title: String class BClass { var subTitle: String init } } struct Astruct { class BClass { var title: String init() { } } var bClass = Bclass() } let aStruct = Astruct() aSTruct.bClass.title
Swift
복사