ARC ๋์ Manual Reference Count ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๋ ๊ผญ ์ฌ์ฉํด์ผ ํ๋ ๋ฉ์๋๋ค์ ์ฐ๊ณ ์ญํ ์ ์ค๋ช ํ์์ค.
- ARC: Automatic Reference Counting
- MRC: Manual Reference Counting
MRC(Manual Reference Counting)๋ฅผ ์ฌ์ฉํ ๋์๋ retain, release ๋ฉ์๋๋ฅผ ๊ผญ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๋ค.
MRC๋ฅผ retain/release ๊ฐ๋ ์ผ๋ก ์๊ฐํด์ MRR(Memory Retain Release)๋ผ๊ณ ๋ ๋ถ๋ฆ
-
retain: retain count(=reference count)์ฆ๊ฐ๋ฅผ ํตํด ํ์ฌ Scope์์ ๊ฐ์ฒด๊ฐ ์ ์ง๋๋ ๊ฒ์ ๋ณด์ฅ
-
[test retain];
- ์ธ์คํด์ค ์์ฑ ์์๋ ์๋์ผ๋ก count +1์ด ๋์ง๋ง ๊ทธ ์ดํ๋ถํฐ ์ธ์คํด์ค์ ์ฃผ์๊ฐ์ ํ ๋น๋ฐ์ ๊ฒฝ์ฐ์๋ retain๋ฉ์๋๋ฅผ ํตํด ์๋์ ์ผ๋ก RC๋ฅผ ์ฌ๋ ค์ฃผ๋ ์์ ์ ํด์ฃผ์ด์ผ ํจ
-
-
release: retain count(=reference count)๋ฅผ ๊ฐ์์ํด. retain ํ์ ํ์ ์์ ๋ releaseํจ
-
[test2 release];
- ARC์์ ํ๋๊ฒ์ฒ๋ผ test2๋ฅผ ๋์ด์ ์ฌ์ฉํ์ง ์์์ nil์ ๋์ ํ๋๋ผ๋ ์๋์ผ๋ก RC๊ฐ 0์ผ๋ก ํด์ง๋์ง ์์. release ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ RC๊ฐ์ ๊ฐ์์ํฌ ์ ์์
-
- ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ
์ด๋๋ MRC์ฌ๋ RC๊ฐ ์๋์ผ๋ก +1 ๋๋ค.
// test๋ผ๋ ์ธ์คํด์ค ์์ฑ
TestClass *test [[TestClass alloc] init];
/*
test.retainCount == 1
*/
- ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ์๋?
test2์์ ๊ธฐ์กด ์ธ์คํด์ค(test)๋ฅผ ์ฐธ์กฐ
ARC์ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก RC๊ฐ +1 ๋์
TestClass *test [[TestClass alloc] init];
TestClass *test2 = test;
// test.retainCount == 1
ํ์ง๋ง MRC๋ ์๋์ผ๋ก retain์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ์์ง RC๊ฐ ์ฆ๊ฐ๋์ง ์๋๋ค.
์ด๋ ๊ฒ retain ์ ์๋์ผ๋ก ํด์ฃผ์ด์ผ retain count๊ฐ ์ฆ๊ฐํ๋ค.
TestClass *test [[TestClass alloc] init];
TestClass *test2 = [test retain];
//test.retainCount == 2
- test2๋ฅผ ๋์ด์ ์ฌ์ฉํ์ง ์์๊ฑฐ์ผ ARC์ฒ๋ผ nil์ ๋์ ํด๋ณผ๊น?
TestClass *test [[TestClass alloc] init];
TestClass *test2 = [test retain];
test2 = nil;
//test.retainCount == 2
์๋๋ค. ์๋์ผ๋ก release๋ฅผ ํด์ฃผ์ง ์์ผ๋ฉด RC๋ ๋ด๋ ค๊ฐ์ง ์๋๋ค.
TestClass *test [[TestClass alloc] init];
TestClass *test2 = [test retain];
[test2 release]; // test.retainCount == 1
test2 = nil; // test2.retainCount == 0
[test2 release];๋ฅผ ํด์ค์ผ๋ก์จ test์ RC๋ 1๊ฐ์ํ๊ณ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ์๋ test2๋ ๊ทธ์ ์์ผ nil์ ๋์ ํ์ฌ 0์์ ๋ช ์ํด ์ค ์ ์๋ค.