BLOG main image
분류 전체보기 (92)
Cocoa Touch (11)
Cocoa (10)
Objective-C (13)
Swift (6)
Development (11)
Tools (11)
Books (7)
etc (21)
Application release (1)
Document Project (1)
skyhack.net
skyhack.net
clash of clans hacks for gems
clash of clans hacks for gems
자료구조에 대한 디미터의 법칙
maccrazy's blog
드리밍 인 코드
The note of Legendre
MakeItBlue의 생각
tuna's me2DAY
83,416 Visitors up to today!
Today 12 hit, Yesterday 11 hit
daisy rss
tistory 티스토리 가입하기!
2015.07.01 13:57

평소에 ARC를 별로 쓰지 않다가 샘플 프로젝트를 ARC로 하고 있는데 재미있는 내용이 보입니다.

performSelector: 메소드에 관한 것인데, MRR의 경우 performSelector의 사용에 있어서 아무런 문제가 없습니다.

하지만 ARC의 경우 warning을 내는 경우가 발생하네요. 아래와 같이 static한 selector를 사용하는 경우는 문제가 되지 않습니다.


[object performSelector:@selector(myMessage)];


하지만 이렇게 사용해서는 selector를 제대로 쓰는 거라 보기는 좀...

만일 SEL에 담긴 임의의 selector를 사용하게되면 “PerformSelector may cause a leak because its selector is unknown”이라고 메시지가 뜹니다.

아래와 같이 코딩을 하면 그런 문제가 생기지요.


[object performSelector:mySelector];


이유는 return type 때문입니다. return type이 객체인지, primitive type인지 autorelease를 해줘야 하는지 retain된 상태인지 컴파일러가 나는 모르겠다는거군요.

뭐 MRR의 경우 컴파일러가 몰라도 개발자가 알아서 할것이기 때문에 굳이 이런 warning을 낼 필요가 없었던 것이지요.


하지만 급기야 swift에 가서는 performSelector 자체를 없애버렸습니다(이전 글에서 썼듯이)!!


여기서 조금 중요한 개념적인 문제를 한번 짚고 넘어가 보죠.

OOP란게 뭔가 잔득 복잡한 이야기 같지만, OOP에서 가장 중요한 키워드만 뽑아보라면 저는 단연코 “객체”, “관계”, “메시지”라고 이야기 하고 싶습니다. “클래스”, “맴버 함수”, “상속” 따위가 아니라는 말이지요.


Objective-C의 performSelector는 다른 언어와 Objective-C가 구별되는 가장 중요한 차이 중 하나인 “메시지”를 대표하는 기능입니다.

Objective-C의 경우 객체만 추상화 되는 것이 아니라 메시지도 추상화 되기 때문에 이 기능을 잘 이용하면 매우 간결하고 아름다운 코드를 만들어 낼 수 있습니다. 그런데 애플은 결국 서서히 메시지의 추상화를 제거해버리는 쪽으로 방향을 잡았군요.

아주 로레벨인 메모리 관리를 하는 방법을 컴파일러가 알아내기 힘들다는 이유로 하이레벨의 중요한 개념 하나를 날려버렸군요. 쩝...


결국 Swift의 경우 메시지 전달은 매우 명시적고 해당 클래스에 강하게 묶여있습니다. 우리는 이것을 맴버 함수 호출이라고하지요.

반면 Objective-C의 경우 메시지 전달과 메소드 호출은  완전 다른 이야기입니다. 어떤 객체에든 메시지를 보내는 것이 자유이고 메시지를 받은 객체는 그 메시지에 대해 어떤 메소드를 이용해서 반응할지 동적으로 결정할 수 있습니다.


여러분은 어느 쪽에 손을 들어주실 것인가요?



저작자 표시 비영리 변경 금지
신고
Trackback Address :: http://maccrazy.tistory.com/trackback/116 관련글 쓰기
Name
Password
Homepage
Secret
2015.06.23 00:40

Swift에서 사라진 performSelector를 대신해서 구현하는 많은 방법들, 예를 들면 GCD, 클로져, 타이머, 심지어 NSThread를 동원하는 방법들이 거론되고 있지만 진정한 핵심을 놓치고 있는것 같다.
대체 가능한 수단이 존재하는 것은 사실이다. (물론 훨씬 지저분한 방법으로...) 하지만 가장 중요한 것은 객체와 메시지로 설명되는 객체지향의 가장 기본적인 내용 및 그것을 가장 우아하게 구현한 ObjC의 기능을 Swift에는 넣지 않았다는 것이다.
객체지향의 관점에서 Swift는 ObjC보다 한참 못한 언어인것 같다.

저작자 표시 비영리 변경 금지
신고
Trackback Address :: http://maccrazy.tistory.com/trackback/115 관련글 쓰기
Name
Password
Homepage
Secret
2015.06.20 00:55

종암님이 예전이 쓰셨던 글을 봤네요.

 

https://jongampark.wordpress.com/2014/10/16/swift-f-script/

 

오랫동안 잊고 있었던 수많은 삽질들의 기록을 어찌 이렇게 잘 해두셨는지.. :)

Swift가 이전 삽질과는 다른 것이 분명해 보이네요. 앞으로 어떻게 될지 궁금하기도 합니다.

결국 Cocoa Framework의 새 주인은 수많은 삽질끝에 Swift로 정리될 것인지...

저작자 표시 비영리 변경 금지
신고
Trackback Address :: http://maccrazy.tistory.com/trackback/114 관련글 쓰기
Name
Password
Homepage
Secret
prev"" #1 #2 #3 #4 #5 ... #31 next

티스토리 툴바