달력

08

« 2012/08 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
2012.08.20 01:41

Strong, Weak, Assign 살펴보기 개발기술/iOS2012.08.20 01:41

ARC가 나오면서 새로운 Property로 strong, weak이 추가되었다. 알다시피 strong은 강한 참조, weak은 약한 참조라는 의미이다. iOS 4.x에서 썼던 retain, assign( unsafe_unretained)의 대체 개념이라고 알고 있는데 어떤 개념으로 쓰이는 것일까? 그리고 weak과 assign은 어떻게 다른 것일까? 이런 궁금증이 발동하여 테스트 코드를 작성해보았다. 아래 코드를 보자.


@interface SMViewController ()

@property (nonatomic, strong) NSObject *strongObj;
@property (nonatomic, weak) NSObject *weakObj;
@property (nonatomic, assign) NSObject *assignObj;

@end

@implementation SMViewController

- (void)printAddress {
    NSLog(@"strong addr : 0x%x", (unsigned int)self.strongObj);
    NSLog(@"weak addr   : 0x%x", (unsigned int)self.weakObj);
    NSLog(@"assign addr : 0x%x", (unsigned int)self.assignObj);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"> init values");
    self.strongObj = [[NSObject alloc] init];
    self.weakObj = self.strongObj;
    self.assignObj = self.strongObj;
    [self printAddress];
    
    NSLog(@"> set strongObj to nil");
    self.strongObj = nil;
    [self printAddress];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"> move another stack");
    NSLog(@"> will die at assignObj");
    [self printAddress];
}


코드의 내용은 strong, weak, assign 값을 선언하고 strongObj에 Object을 할당한 다음 weakObj와 assignObj에 strongObj을 세팅하고 생명주기가 어떻게 되나 살펴보는 내용이다.


결과는 이러했다.


> init values
strong addr : 0x6a20320
weak addr   : 0x6a20320
assign addr : 0x6a20320
> set strongObj to nil
strong addr : 0x0
weak addr   : 0x6a20320
assign addr : 0x6a20320
> move another stack
> will die at assignObj
strong addr : 0x0
weak addr   : 0x0
== BAD ACCESS ==


처음 시작할 때는 strongObj의 강한 참조값이 살아 있어 weakObj, assignObj의 주소값이 모두 찍힌다. strongObj값을 날려버리고 난 후에는 strongObj의 주소는 0x0이 되고 다른 Obj들은 그대로이다. 


그런데 결과의 12라인을 보면 다른 스택으로 넘어가는 순간 weakObj의 주소값이 0x0으로 바뀐 걸 알수가 있다. 코드로 아무런 조치도 안 했는데 자동으로 값이 바뀐 것이다. weakObj의 약한 참조가 strongObj의 오브젝트가 메모리에서 사라지면서 풀려버린 것이다!! (ARC를 쓰면 오브젝트에 대한 BAD ACCESS의 위험이 대폭 줄어들 것이라는 예상을 할 수가 있다.)


그리고 그 다음 라인에서 assignObj의 주소값을 찍으려는 순간 앱은 BAD ACCESS 내뱉고 죽어버린다. assignObj가 가지고 있는 address의 오브젝트에 대한 잘못된 접근을 했다는 말인데 메모리에서 오브젝트가 사라지더라도 값은 그대로 남아있어 문제를 일으켰다는 것을 알 수 있다.


이 간단한 테스트로 weak과 assign의 차이를 알 수 있고, strong, weak의 쓰임, assign의 쓰임에 대해서도 얼핏 짐작할 수가 있다.


정리하면, strong, weak은 오브젝트을 참조할 때 쓰고, assign은 int, float, double 등과 같은 primitive type에 대해값을 할당할 때 쓰면 되겠다.


TestWeakAssign.zip


저작자 표시 변경 금지
신고

ARC, non-ARC 소스가 같이 있는 프로젝트에서 메모리 해제가 잘 될까?


궁금해서 데이터 오브젝트를 하나 만들어 해제하는 간단한 테스트 프로젝트를 만들어 보았다.



TestARC.zip



프로젝트에 대해서 대충 설명하면, ARC을 사용하는 프로젝트를 만들고 ARC, non-ARC 소스 두개를 만든다.


@interface SMData : NSObject

@property (nonatomic, strong) NSData *data;

@end


@implementation SMData

- (id)init {
    self = [super init];
    if (self) {
        self.data = [NSMutableData dataWithCapacity:1024*1024];
    }
    return self;
}

@end

<ARC소스는 strong을 써서 1메가를 할당하는 오브젝트>


@interface SMData_noARC : NSObject

@property (nonatomic, retain) NSData *data;

@end

@implementation SMData_noARC

@synthesize data = _data;

- (id)init {
    self = [super init];
    if (self) {
        self.data = [NSMutableData dataWithCapacity:2*1024*1024];
    }
    return self;
}

- (void)dealloc {
  [_data release];
  [super dealloc];
}

@end

<non-ARC소스는 기존 방식대로 retain을 쓰고 2메가를 할당하는 오브젝트>



그리고 컴파일 에러가 나지 않게 non-ARC소스에는 -fno-objc-arc 플래그를 지정한다.



이제 Alloc, Release 하는 버튼을 만들어 데이터 오브젝트를 생성하고 해제할 수 있도록 만든다.


- (IBAction)onAlloc:(id)sender {
    self.data = [[SMData alloc] init];
}

- (IBAction)onRelease:(id)sender {
    self.data = nil;
}

- (IBAction)onAllocNoARC:(id)sender {
    self.data_noARC = [[SMData_noARC alloc] init];
}

- (IBAction)onReleaseNoARC:(id)sender {
    self.data_noARC = nil;
}


<실행화면>



이제 메모리를 생성하고 해제하는 동작이 잘 되는지 Instrument 을 통해서 확인한다.


Xcode 메뉴의 Open Developer Tool에서 Instrument을 실행한다.




Allocations을 선택한다.



Choose Target > Attach to Process 에서 TestARC을 선택한후 Record을 누르면 Allocations 모니터링을 할 수가 있다.




버튼을 누를때마다 그래프가 오르락 내리락 하는 걸 통해 정상적으로 메모리가 할당되고 삭제되는걸 확인할 수가 있고, 통계 수치를 통해서도 알 수가 있다. (Malloc 1.25MB는 ARC로 만든 데이터, Malloc 2.50MB는 non-ARC로 만든 데이터)





이로써 ARC, non-ARC 둘다 섞인 소스도 메모리 관리가 정상적으로 된다는 것을 알게 되었네요...

의심이 많다보니 오늘은 뻘짓을 좀 해봤습니다. ㅋㅋ



TestARC.zip



저작자 표시 변경 금지
신고
2012.08.16 13:49

이명뱅크 나비효과 짧은글2012.08.16 13:49

미CNN, 한국 대통령은 '이명뱅크' 오기 실수 (2012.08.14)


미국의 CNN방송이 이명박 대통령을 '이명뱅크'라고 표기하는 실수를 했다. CNN은 지난 14일 홈페이지를 통해 '일본과의 분쟁 지역에 헤엄쳐 들어간 한국 가수(South Korean singer swims into island dispute with Japan)'라는 제목의 기사에서 가수 김장훈을 포함한 40여 명이 8·15 광복절을 기념해 독도 수영횡단을 한 소식을 보도했다. 


...


CNN은 "몇 시간 뒤 한국의 유명 록 가수(김장훈)가 외교적 분쟁에 휩싸인 동해, 또는 일본해의 작은 바위섬으로 진입한다"며 소식을 전했다.   그러면서 "이 정치적인 행사는 이명박 대통령이 남한 대통령 중 최초로 독도를 방문한 지 며칠 뒤에 일어난 것"이라며 이명박 대통령을 언급했다.  


이 과정에서 CNN은 이명박 대통령의 이름을 '이명박(Lee Myung-Bak)'이 아닌 '이명뱅크(Lee Myung-Bank)'라고 표기했다. 


http://news.mt.co.kr/mtview.php?no=2012081611354271375

 

o

o

o


제일·프라임상호·제일2저축은행 파산신청 (2012.08.14)

http://news.mt.co.kr/mtview.php?no=2012081413438287486

 

부산지법, 부산저축은행에 '파산 선고' (2012.08.16)

http://imnews.imbc.com/news/2012/society/article/3118291_10156.html


저작자 표시 변경 금지
신고

'짧은글' 카테고리의 다른 글

드디어 D-Day!  (0) 2012.12.19
망할! 애플 스토어 공사중이네..  (0) 2012.09.14
이명뱅크 나비효과  (0) 2012.08.16
개발 잡담  (0) 2012.08.11
안드로이드용 정치인D노트 개발기  (0) 2012.08.03
넥서스S 구입  (0) 2012.04.07
2012.08.11 01:23

업데이트 안내 앱스토어/정치인D노트2012.08.11 01:23

안녕하세요. 무지막지하게 더운 여름이네요.

업데이트가 있어서 알려드립니다.


1. 안드로이드 앱 Google Play 출시


8월 9일에 구글 개발자 승인이 되어 Google Play에 앱을 등록하였습니다. 안드로이드는 iOS와 다르게 이슈,인물,뉴스를 조회하는 용도로 만들어졌습니다. 그리고, 새로운 소식을 알림으로 받을 수 있습니다.


* Google Play 의 정치인D노트 바로가기



2. 사이트 업데이트 안내


8월 10일에 사이트도 이슈, 인물, 뉴스를 조회, 검색할 수 있도록 업데이트하였습니다. 퍼블리셔가 아니라서 디자인은 구리지만 보는데는 지장 없을 것입니다. ^^


* 정치인D노트 사이트 바로가기



3. iOS 향후 업데이트 안내


다음과 같은 업데이트가 있을 예정입니다. (아직 작업 전입니다.)

  • Android와 사이트처럼 주요 컨텐츠를 이슈, 인물, 뉴스로 단순화
  • 새소식 PUSH 알림 기능 추가
  • 기존의 로그인(약관폐기), 글작성 및 업로드 기능 삭제
  • 보관함(이슈,인물,북마크) 삭제 (혹, 사용하는 분이 있다면 기능을 유지할지 고려해보겠습니다.)
  • 인터넷 방송, 기타(SNS,인터넷검색) 등 삭제

활용도 떨어지는 기능들은 없애고 단순화하여 사이트 관리, 앱관리 등의 운영을 하는데 지장이 없도록 하기 위한 조치이니 이해해주시면 고맙겠습니다. 그리고 안드로이드 앱 출시에 따라 iOS, 서버와의 호환성을 위해서 현재 iOS에서의 글 업로드 기능을 제한하였습니다. (사실, 글 올리시는 분 한명도 없어서 여기에 대해서 큰 걱정은 없습니다.. ㅠㅠ)


그리고.. 보관함의 기능도 없앨 예정인데 혹시 필요하신 분이 계시다면 메일로 알려주십시오. 의견을 참고하여 어떤 방향으로 수정할지 생각해 보도록 하겠습니다.


앞으로의 앱은 이슈, 인물, 뉴스를 조회, 검색하는 용도로 만들어질 것이며 새소식 알림을 받을 수 있게 될 것입니다.


이상입니다.!

다른 문의사항이나 의견이 있으시면 앱을 통해서 메일로 문의해주세요 ^^


PS. 앱이랑 사이트 홍보 좀 부탁합니다. (__)


저작자 표시 변경 금지
신고
2012.08.11 00:53

개발 잡담 짧은글2012.08.11 00:53

아 힘들다.

사이트 개발/관리, 앱 개발/업데이트, 자료 수집/등록들을 혼자서 다하려니 죽을 맛이다. -_-;


디자인은 뭐.. 생각도 못하겠다. ㅋ

디자인은 기본 그대로 가져다 쓰고 대충 대충 기능 붙이고 있는 형편.. 


내용만 잘 보이면 되지 뭐.. ㅜㅜ


그래도 이제 쓸만한 라이브러리 많이 만들어놨으니 앞으로 개발할때는 편해지겠지~*

담 플젝은 뭘로 해볼까나~


저작자 표시 변경 금지
신고

'짧은글' 카테고리의 다른 글

망할! 애플 스토어 공사중이네..  (0) 2012.09.14
이명뱅크 나비효과  (0) 2012.08.16
개발 잡담  (0) 2012.08.11
안드로이드용 정치인D노트 개발기  (0) 2012.08.03
넥서스S 구입  (0) 2012.04.07
알바 끝~ 다시 일상으로~  (0) 2012.04.04
2012.08.03 13:39

안드로이드용 정치인D노트 개발기 짧은글2012.08.03 13:39

알바 이후 후유증이 가시지 않는 바람에 한동안 잠수를 탔다. 날이 따뜻해지니 몸도 나른해지고 여름이 다가오니 체력이 딸리기 시작하더니 게으름병이 도진 것. -_-;


그래도.. 요양 아닌 요양을 보내면서.. 기특하게도(?) 짬짬이 안드로이드 개발 준비를 하기는 했다. 


안드로이드 개발은 2009년도에 첨 시작했는데 Cupcake, Donut, Eclair, Froyo (2.2)까지만 열심히 연구했고, 다른 회사로 이직하면서부터는 iOS 개발을 주력으로 하고 안드로이드는 보조로 개발했었다. 회사에 다른 안드로이드 개발자가 있었기에 Core 개발만 도와주고 나머지 개발업무는 관여하지는 않았다.


그러다 보니 허니콤 이후 새로운 변경사항에 대해서는 그리 밝지 않은 상태여서 굉장히 불안했다. 태블릿이 나오면서 어떤 식으로 개발해야 할지 그리고 OS 버젼 호환성 문제는 어떻게 해결해야 할지에 대해서 막연한 불안감이 있었다. 안드로이드 개발할때 제일 괴로웠던 다양한 기기와 버젼 호환성 문제가 생각났기 때문이다. -_-;


폰과 태블릿을 지원하고 버젼 호환성 문제도 해결할수 있는 방법에 대해서 몇일 씨름한 끝에 SDK 상위 버젼에 있는 Fragment란 놈을 써야 한다는 것을 알았고 그러다 찾은게 Android Support Library 라는 훌륭한 것을 찾았다. 이 라이브러리는 하위 버젼에는 없는 상위 버젼의 유용한 API들을 모아놓은 라이브러리이다. 물론 상위 버젼의 모든 API들을 제공해주지는 않지만 호환성 문제를 해소하기에 충분한 API들을 제공해준다.


그리고 또 하나 훌륭한 점이 바꼈는데 Android Library Project을 만들 수 있게 되었다는 점. 앱개발시 빈번하게 사용될 소스들을 Copy & Paste 하지 않고 라이브러리화 해서 사용할 수 있게 된 것이다. 이 개념을 발견하자마자 여러가지 라이브러리들을 만들 계획을 세웠다. Core, App, DB, AD ... 등등등..


결론적으로 Android Support Library을 활용해 내게 필요한 Android Library Project를 만들어 호환성 문제도 해결하고 앱개발시 시간을 단축할 수 있는 작업을 했다.


이 작업의 결과물로 "정치인D노트" 안드로이드 버젼을 개발해 보았다. 

아래는 맛보기 스크린샷..


  


이 앱은 이론적으로 2.2버젼부터 4.1버젼까지 지원가능하다. 에뮬레이터 상으로는 문제없이 돌아갔지만.. 실기기에서는 현실적인 문제로 테스트를 못해봐서 어떻게 될지는 모르겠다. ;



아무튼 개발은 어느정도 마쳤고 이제 구글 개발자 등록만 하면 되는데.. 

등록 처리에서 막힌 상태.. -_-;



등록처리 기간을 검색해보니 짧게는 3~5시간, 보통 2~3일, 재수 없으면(문제 발생시) 1주~3주의 기간이 걸린다고 한다. Google Play로 바뀌면서 등록처리가 길어졌다는 얘기가 있는 듯 하다.


현재 2일이 지난 상태니.. 내일 등록 안되면 1주일 이상 걸릴 것 같다.. ㅠㅠ

그동안 차기작 구상이나 해야겠다. 우훗~!


저작자 표시 변경 금지
신고

'짧은글' 카테고리의 다른 글

이명뱅크 나비효과  (0) 2012.08.16
개발 잡담  (0) 2012.08.11
안드로이드용 정치인D노트 개발기  (0) 2012.08.03
넥서스S 구입  (0) 2012.04.07
알바 끝~ 다시 일상으로~  (0) 2012.04.04
아 미치... =_=;  (0) 2012.03.23


티스토리 툴바