본문 바로가기

프로그래밍 세상/iOS 이야기

삼성 멀티캠퍼스 iOS 강의 2일차 정리...

1교시

객체 생성

TestClass * t1 = [[TestClass alloc] init];

alloc 과 new 의 차이점

alloc 과 new 는 객체를 생성한다는 점에서는 동일하지만, new 는 파라메터가 없는 init 함수가 실행되므로 객체 생성과 동시에 변수를 초기화 할 경우에는

alloc 을 이용해서 객체를 생성해야 한다.


TestClass * t1 = [[TestClass alloc] init];

[t1 retain];

retain 메서드를 이용하면 retain count 를 증가시킬수 있다.

[t1 release];

release 메서드를 이용하면 retain count 를 감소시킬 수 있다.

NSLog(@"retian count : %d", (int) t1.retainCount);

t1의 retainCount Property를 이용해서 retain count 값을 알 수 있다.

retain count 를 증가시켰으면, 반드시 release 를 통해 아님 다른 방식으로 retain count를 감소 시켜야 한다.

만약 같은 객체 주소를 getter 를 통해 참조해서 retain count 를 증가시켰다면 반드시 증가시켰던 객체가 retain count 를 감소시켜야 한다.

retain count 가 0이 되면  OS 는 객체 소멸을 시작한다.


autorelease

retain count 가 1 이었을 때 release 를 하게 되면 객체는 소멸되게 되어, release 다음 문장에 소멸된 객체를 사용하려 할 경우 오류가 발생한다.

하지만, autorelease 는 OS 내키는 때 객체를 소멸시키기 때문에 autorelease 다음에 소멸 예정인 객체를 사용하게 되더라도 오류가 발생하지 않으면

정상적으로 호출됨을 알 수 있다.


retain count 를 0으로 만드는 행위는 객체의 소유권을 해지한다는 의미로 OS 가 객체를 폐기(deallocation), 소멸 시킨다.

retain count 로 객체의 생성, 소멸까지 관리하는 Object-C입장에서는 가장 중요한 요소이며, 개발자간의 약속이다.


2교시

property

default 값: automic, readwrite, assign

readonly 로 설정할 경우 setter 는 사용하지 못하며, getter 만 사용할 수 있다.

만약 readonly 설정된 property 에 값을 설정하려고 하면 오류가 발생한다.


@"안녕" 의 경우 OS에 의해서 객체가 생성되고, 소멸된다. OS 가 메모리 관리를 한다는 의미이다.

그러므로 이러한 문자열이 언제 소멸될지 모르며, 예전 iOS 버전에서는 바로 위에서 사용했던 문자열을 사용하려고 했을 경우 오류가 발생했다가

그 다음 줄의 소스에서는 정상적으로 동작하는 버그가 종종 있었다. 지금은 많이 개선된 상태... 하지만 장담은 못한다.

이러한 문자열로 객체를 생성한 경우 retain, release 를 개발자가 설정하더라도 큰 의미가 없다.


copy : 동일한 문자열을 복사하여 사용하며 retain 은 주소를 참조 및 rc++ 해주는데 좀 불안하다. 그래서 복사 방식인 copy 가 안정적이다.


아이폰은 멀티 쓰레딩을 권장하지 않는다. 그래서 property 의 경우 기본 값이 nonautomic 이다.

멀티쓰레딩의 경우 배터리 및 메모리 관리가 힘들기 때문이다.


------------------

팩토리 메서드 

+ 로 정의 및 구현하는 클래스 메서드에서 객체를 생성하는 경우 팩토리 메서드라고 부른다.

이러한 경우 autorelease 를 꼭 작성하여야 하며, 기존에 작성되어진 팩토리 메서드의 경우 autorelease 가 있다고 생각하면 된다.

메서드 내부에서 객체를 이용하려고 할 경우 팩토리 메서드가 적당하며,

여러 메서드에서 빈번히 사용하는 경우는 alloc 을 통해 객체를 생성하는 것이 좋다.

팩토리 메서드는 autorelease 를 사용하기 때문에 OS 에서 관리한다. 그래서 언제 소멸될지 불확실하다.


 XCode 4 버전에서 추가된 사항

1. release 를 사용안하면, 메모리 누수가 발생하며, 이러한 누수를 분석하는 툴이 추가되었다. 바로 Run - Analysis 를 실행할 경우

retain count 를 체크하여, release 를 사용해야 하는 곳에 대한 정보를 준다.

아마 다른 용도로도 사용 가능 할 듯 하나,  복잡한 로직의 경우 찾기 힘든 단점이 있다.

2. New Project 를 만들 경우 use Automatic Reference Counting 이라는 체크 항목이 있는데,

체크할 경우 개발자가 메모리 관리를 위해 retain, release 를 할 경우 오류가 발생한다.

이것을 체크한 경우 메모리 관리를  OS에 위임한다는 것으로 Java, C# 의 GC 처럼 알아서 관리해준다.

게임의 경우는 이러한 기능을 사용하게 되면 낭패를 보게 되니 개발자가 관리하는 것이 좋다.

초기 아이폰 개발자의 경우 애매한 release 사용 시기를 결정하지 못해 안쓰는 경우가 있고, 이러한 경우 메모리 누수가 발생한다.

그래서 이러한 기능이 추가되었다.


3교시

https://developer.apple.com/devcenter/ios/index.action

에는 동영상 강의,  Reference API 등 유용한 정보들이 있다.

XCode 에서도 볼 수 있는데, Window-Organizer 에 들어가 보면 API 를 볼 수 있다.

API는 Classs 에 대한 많은 정보가 있는데, 텍스트로만 되어 있어 Java API 만큼이나 보기 힘들다...

난 MSDN이 좋아...ㅎㅎㅎ