이번에는 아이폰 앱을 만들어서 배포하기 위해서 필요한(혹은 테스트를 위해 필요한) iOS 개발자 프로그램에 대해서 간단히 비교를 해보고자 한다.

 

 

 

0. 어떤 것들이 있나?

 

iOS 개발자 프로그램(iOS Developer Program)에는 아래와 같이 크게 3가지 종류가 있다.

iOS Developer Program / iOS Developer Enterprise Program / iOS Developer University Program

 

 

앱을 개발하여 앱스토어에 등록하고자 한다면 첫번째인 iOS Developer Program을 신청해야 한다.

iOS Developer Enterprise Program의 경우에는 기업에서 사내에 웹을 통해서 앱을 배포하고자 할 때(in-house 배포 방식) 신청하면 된다.

iOS University Program은 등록해보지 않아서 잘 모르겠지만, 대학에서 아이폰 앱 개발을 학습/지도 하고자 하는 목적으로 신청하는 프로그램인 것 같다(잘 모르겠으므로 이 포스트에선 이런 정도로만 다루겠다).

 

자세한 비교 내용은 아래 표를 참고하면 된다.

 

 

 

 

 

1. iOS Developer Program

 

 

 

가장 기본적인 형태의 개발자 프로그램으로, 위에서 언급했듯이 앱스토어에 앱을 등록하기 위해서 꼭 신청해야 한다. 참고로 가격은 $99/year 이다.

 

iOS Developer Program은 다시 개인/회사 둘로 나뉘는데, 말 그대로 개인 개발자의 경우 개인으로 신청하면 되고, 회사의 경우 회사로 신청하면 된다. 다만 회사의 경우 신청을 위해서는 DUNS Number와 영문 사업자등록증이 필요하기 때문에 등록이 번거로울 수 있다. 신청 방법에 대해서는 다른 포스트에서 소개하도록 하겠다.

 

 

 

2. iOS Developer Enterprise Program

 

 

사내에 웹을 통해 앱을 배포하고자 할 경우에 사용하는 프로그램으로, $299/year 이다.

 

Enterprise Program의 경우 과거에는 500인 이상이 있는 기업의 경우에만 신청이 가능했다고 하는데, 최근에는 DUNS Number만 있다면 신청이 가능하다(물론 DUNS Number를 발급 받는 과정도 약간 번거롭다). 신청 방법은 마찬가지로 다른 포스트에서 소개하도록 하겠다.

 

 

 

 


제목 그대로, UIImageView에 웹 상의 이미지를 띄우는 방법을 알아보자.


1. xib에 UIImageView 생성
- xib에서 Object Library에 있는 Image View를 끌어다가 생성한다.


2. 헤더에 UIImageView 객체 생성
- 위에서 사용한 xib와 연결된 헤더 파일에서 UIImageView 객체를 생성한다.
@interface SampleViewController : UIViewController {
    UIImageView *webImage;
}
@property (nonatomicretainIBOutlet UIImageView *webImage;



3. 구현파일에 @synthesize 코딩

@implementation SampleViewController
@synthesize webImage;



4. 이미지 뷰를 나타내고자 하는 메서드 안에서 웹 상의 이미지를 UIImageView로 불러오기(여기서는 ViewDidLoad에 구현)

- (void) viewDidLoad {
    [super viewDidLoad];
    NSURL *imageURL = [NSURL URLWithString:@"http://static.naver.net/www/u/2010/0611/nmms_215646753.gif"];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];        
    webImage.image = [UIImage imageWithData:imageData];
    
}



끝!


이미지 경로가 가변적이라면, 웹 상의 이미지가 없을 경우(imageData가 nil일 경우) 예외 처리를 해주면 좋다.



웹뷰를 사용하여 각종 처리를 할 때, 특히 로그인과 관련된 처리를 할 때 특정 사이트에 대한 쿠키를 삭제하고 싶은 경우가 있다. 예를 들어 한 사이트에 여러 개의 계정을 사용할 경우 쿠키를 삭제하지 않고 다른 계정으로 바로 로그인한다면 이전 계정 정보와 겹쳐 꼬일 수 있다.


뭐 기타 등등의 이유로 쿠키를 삭제해야 할 경우가 있을텐데, 특정 사이트에 대한 쿠키를 삭제하는 방법은 매우 간단하다. 아래 코드와 같다.


    //쿠키 삭제
    NSHTTPCookieStorage *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *someCookies = 
    [cookies cookiesForURL:[NSURL URLWithString:@"http://website.com"]];
    
    for (NSHTTPCookie *cookie in someCookies){
        [cookies deleteCookie:cookie];
    }


우선 쿠키 객체를 생성하고, 특정 URL에 대한 쿠키를 Array에 집어넣은 후 deleteCookie 메서드를 사용하여 삭제하면 된다.


끝!


웹뷰를 이용한 어플리케이션을 개발 중인데, HTTP 통신을 사용하다보니 3G가 느린 환경에서는 데이터를 받아오거나 해당 페이지로 접속을 하는 과정에서 로딩이 길어질 때가 있다. 처음에는 페이지 접속하고 로그인 하는 정도인데 뭐가 느릴까 싶었지만, 느린 환경이 의외로 많고(회사에서 Wi-Fi 끄면 장난 아님), 이때 Activity Indicator가 없으면 기다리는 동안 이게 에러인지 로딩중인지 헷갈릴 때가 많았다. 그래서 결국 구글링을 통해 Activity Indicator를 적용하였고, 적용법은 굉장히 쉬웠다.


1. ㅇㅇㅇ.h 에 정의


@interface ViewController : UIViewController
{
 UIActivityIndicatorView *activityIndicator;
}

 @property (nonatomicretainUIActivityIndicatorView *activityIndicator;


인터페이스 안에 UIActivityIndicatorView를 하나 정의해주고, 프로퍼티도 ㄱㄱ



2. ㅇㅇㅇ.m 에 구현


@synthesize activityIndicator;

   
-(void)webViewDidStartLoad:(UIWebView*)webView     

    

// ProgressBar Setting   

   activityIndicator = [[UIActivityIndicatorView allocinitWithFrame:CGRectMake(003232)];    
   [activityIndicator setCenter:self.view.center];
   [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];
   [self.view addSubview : activityIndicator];    
   
   // ProgressBar Start
   activityIndicator.hiddenFALSE;
   [activityIndicator startAnimating];    

}    


- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [activityIndicator stopAnimating];     
    activityIndicator.hiddenTRUE;
}


위 경우, 웹뷰에 Activity indicator를 적용하는 것이기 때문에 webViewDidStartLoad라는 메서드 안에서 Activity Indicator를 활성화시키고, webViewDidFinishLoad 메서드 안에서 비활성화 시켰다. 활성화, 비활성화를 원하는 메서드 안에 각각 넣어두면 될 것이다.



처음부터 원리를 다 이해하고 코딩을 한 것이 아니라, 일단 기능 구현이 우선이었기 때문에 사실 위 코드가 정확히 어떤 원리에 의해서 어떻게 적용되고 있는건지는 어렴풋이 짐작만 하고 있는...;;


암튼 기능은 무리없이 구현되는데, 주의할 점은 Activity Indicator 활성화 코드를 포함하고 있는 메서드가 2번 호출이 된다면 Activity Indicator도 2번 만들어지기 때문에 나중에 비활성화 코드가 포함된 메서드가 1번 호출되어도,  Activity Indicator가 남아있을 수 있다. 이 점은 어차피 꼭 Activity Indicator가 아니라도 비효율적인 코드가 될 수 있는 거기 때문에 알아서 주의하면 될 듯.




최근에 '앱스토어 골드러시(정태훈)'를 읽고 있는데, 중간에 아이폰 어플리케이션 제작을 위해서는 팀이 각자 책임지는 일을 분담하여야 한다는 내용이 나온다. 그렇게 하지 않으면 인간은 게으르기 때문에, 서로에게 업무를 떠넘기다가 일정이 늦어지게 될 가능성이 있다는 것이다.

 

이렇게 분담해야 하는 업무를 크게 9가지로 적어주었는데, 당연하게 생각되면서도 참 분담하기에 적절히 나눴다고 생각한다. 물론 기획이나 각종 의사결정의 경우 함께 해야할 경우도 많이 있지만, 큼직하게 분담을 하면 그렇다는 것이다.

 

참고로 개발이나 디자이너가 포함되지 않은, 앱을 기획할 수 있는 사람들로만 이루어진 팀의 경우에 필요한 업무들이다.

<아이폰 어플리케이션 제작을 위해 필요한 업무들>

1. 마케팅

2. 외주 제작자 구인(개발자, 디자이너 등)

3. 앱 기획

4. 기획된 기획안에 따라 디자이너와 소통해 디자인을 만들어내는 일

5. 기획된 기획안에 따라 프로그래머와 소통해 프로그래밍을 지시하는 일

6. iTunes Connect 관리(엑셀 잘 하는 사람이 유리)

7. 애플 개발자 계정 만들기

8. 디스크립션 작성

9. 홈페이지 또는 블로그 관리

(출처 : 앱스토어 골드러시 by 정태훈)

 

그리고 아래 내용은, '앱스토어 골드러시'에서 본 내용 + 평소 주변의 어플리케이션 기획자, 개발자, 디자이너 등을 보며 느낀 내용 + 주어들은 지식으로 적은 내용이고, 나는 막상 앱 기획이나 개발이나 디자인을 해보지 않았으므로 좀 맘에 안 드는 내용이 있더라도 '그냥 그런가보다' 하고 넘어가주길 :)

 

1. 마케팅

어플리케이션의 경우 마케팅을 할 수 있는 방법이 그렇게 많지 않은 것 같다. 크게 2가지로 나누어서 광고와 마케팅이 있을 것 같은데, 광고의 경우 초기자본이 없는 사람들이라면 하기 어려우므로 패스. 마케팅은 돈이 안 드는 것들만 적어보자면 ...

1) 아이폰 관련 커뮤니티에 글을 올린다.

2) 만드는 앱의 특성과 관련된 커뮤니티에 글을 올린다.

3) 페이스북, 트위터 등 SNS를 이용해 알린다.

뭐 이 외에도 많이 있을 수 있지만, 효과적인 방법은 저정도? 블로그를 이용하는거는 아래에 있으므로 패스.

 

2. 외주 제작자 구인(개발자, 디자이너 등)

개발자, 디자이너를 구할 때는 개발자 커뮤니티, 디자이너 커뮤니티에 구인글을 올리는 것이 좋다고 한다. 맥부기라는 카페가 있는데, 여기에 글을 올려도 개발자, 디자이너들이 많은 것 같다. 구인을 할 때는 아이디어를 다 알려주기 보다는, 어떤 기능을 구현해야 하는지, 어떤 페이지 디자인들이 필요할지, 어느 정도 규모가 될지 등을 간단히 올리고 이에 적합한 사람을 구인한다. 그리고 포트폴리오를 받는 것이 좋다. 구인을 하고 나서 상세협의를 할 때는 기획이나 아이디어를 모두 알려줘야 하므로 아이디어 보호 서약서? 지적재산 보호 서약서? 이런걸 작성한다.

 

3. 앱 기획

말 그대로 어플리케이션을 기획한다. 아이디어가 있다면 이 아이디어를 문서로 나타내어 개발자나 디자이너에게 보여줄 수 있어야 한다. 처음에는 종이에 그리기를 시작하더라도, 나중에는 ppt에 깔끔하게 정리하는 것이 좋다. 일단은 생각나는 페이지를 모두 그려보고, 각 페이지의 설명을 간단히 쓰고, 그려진 페이지들을 연결하는 순서로 작업하는 것이 좋다.

 

4. 기획된 기획안에 따라 디자이너와 소통해 디자인을 만들어내는 일

기획된 기획안을 바탕으로 디자이너에게 필요한 디자인 내용들을 정리하여 보내고, 팔로우업한다. 이때 최대한 상세하게, 가능하면 예를 들어가며 설명해야한다. 자신은 머릿속으로 상상을 하며 그림을 그리고 글로 써서 보내주는 것이지만, 디자이너 입장에서는 다르게 생각될 가능성이 높기 때문이다. 커뮤니케이션이 정말 중요하다.

 

5. 기획된 기획안에 따라 프로그래머와 소통해 프로그래밍을 지시하는 일

디자이너와의 소통과 마찬가지로, 최대한 상세히 기록하고 설명하여 자신이 원하는 기능이 구현되도록 한다. 예를 들어 버튼을 눌렀을 때 화면 속의 공이 튀기는 기능을 구현하고 싶다면, 공은 어느정도 높이로 튀기게 하면 좋을지, 어느 정도 속도로 튀기게 하는게 좋을지(최고 높이까지 몇초만에 도달할것인지 등), 한번만 튀기고 말 것인지 점점 튀는 높이가 낮아지면서 계속 튈 것인지 등등 최대한 상세하게!(적어놓고 보니 좀 부적절한 예 같긴 하지만, 암튼 자세히...)

 

6. iTunes Connect 관리

이건 정말 한번도 사용해보지 않았는데, 앱스토에 올린 어플리케이션 매출을 확인해주는 앱이라고 한다. 엑셀을 잘 다루는 것이 좋다고 하는 것으로 보아 앱에서만 확인하는 것이 아니라, 엑셀로도 다운로드 받을 수 있는 형태가 아닌가 예상해본다. 근데 내 생각에 앱을 출시하기까지의 단계에서는 그냥 애플 개발자 계정을 만드는 사람이 같이 관리해도 좋을 듯...

 

7. 애플 개발자 계정 만들기

애플 개발자 홈페이지(http://developer.apple.com)에 들어가보면 1년에 $99를 지불하고 개발자 계정을 만들 수 있다. 앱스토어에 앱을 출시하거나, 실제 기기에서 테스트하려면 꼭 개발자 계정이 있어야 한다. 개인계정과 법인계정이 있는데, 개인계정은 쉽게 만들 수 있지만 법인계정의 경우 영문사업자등록증 등을 제출해야하므로 좀 귀찮을 수 있다. 참고로 Enterprise 계정도 있는데, 이는 1년에 $299를 지불한다. Enterprise 계정을 생성하면 앱스토어에는 앱을 올릴 수 없고, In-House App이라고 하여 웹을 통해 앱을 내부적으로 배포할 수 있다.

 

8. 디스크립션 작성

앱스토어에 올라간 앱의 설명, 스샷 등을 작성하는 작업이다. 어디선가 본 통계에서 젊은 층일 수록 스샷을 많이 참고하고, 나이가 있는 층일수록 설명을 많이 참고한다고 한다. 나의 경우에만 봐도 일단 스샷을 보고, 끌리면 다운로드를 클릭하고 설명을 읽어보는 것 같다.

 

9. 홈페이지 또는 블로그 관리

홈페이지나 블로그가 있다면 관리를 하는 역할. 하지만 앱을 처음 출시하는 입장이라면 홈페이지나 블로그가 없지 않을까? 뭐 블로그는 쉽게 만들 수 있긴 하지만... 블로그는 크게 2가지 목적을 가지고 운영, 포스팅할 수 있다. 하나는 기획자, 개발자의 스토리를 솔직하게 올리고 리뷰를 받을 수 있는 소통의 창으로서 활용한다는 것, 나머지 하나는 특정 키워드로 검색을 했을 때 상위에 노출이 되도록 함으로써 직간접적인 홍보를 할 수 있는 수단으로 활용한다는 것. 당연히 이 두가지 모두로 사용할 수도 있다. 그런데 나름 방문자수가 많았던 기업블로그를 운영해본 입장에서, 완전 단기간에 블로그에 포스팅을 하여 메인 포탈의 상위에 글을 노출시키긴 쉽지 않다. 앱을 만들어야지 하고 생각한 순간부터 블로그에 꾸준히 포스팅을 하다가, 앱이 완성된 시점(아마... 짧으면 1달, 길면 3달 정도?) 쯤에는 홍보를 위한 포스팅을 한다면 효과가 있을 것이다.

 

블로그 관련된 글 예전에 쓴거 같은데 임시저장만 해두고 발행을 안 했나보네.. 나중에 다시 정리해서 올려야지.

 

 

 

 


아이폰 어플리케이션을 개발하는데 있어서 Push Notification 기능을 개발하기 위해서는 애플 개발자 계정을 등록하고, Provisioning 파일을 받아야 한다. 이때 참고한 사이트는 아래와 같다.


그런데 위 두 포스트에 자세히 설명되어 있는대로 그대로 따라서 했으나, device token을 계속해서 받아오지 못하는 것이다! 


Error: Error Domain=NSCocoaErrorDomain Code=3000 "응용 프로그램에 대해 발견된 'aps-environment' 인타이틀먼트 문자열 없음"


이라는 오류가 나왔는데 구글링을 해보니, 이는 프로비저닝 파일이 잘못되었기 때문이니 프로비저닝 파일을 지우고 다시 다운로드 해보라는 답들을 얻었다. 이러한 답을 얻은 곳들 중 대표적인 사이트는 아래와 같다.


http://blog.jidolstar.com/725


그런데 프로비저닝 파일을 지우고 다시 설치하기를 4~5번을 해도 같은 에러만 반복해서 나오고 device token은 받아오지 못한다. 빡쳐서 인증서까지 싹 다 지우고 처음부터 다시 하기도 3번 정도 반복했는데도 같은 에러... 인내심의 한계를 느끼며 좌절하다가 주말을 보내고 나서 상쾌한 마음으로 월요일 아침 출근! 역시 산틋한 마음으로 살펴봐서 그런지 문제를 드디어 해결했다.



1) App IDs를 생성할 때 Bundle Identifier (App ID Suffix) 를 입력하는 곳이 있다. 애플에서는 예로 com.domain.appname을 들어줬는데, 이때 domain부분과 appname 부분을 그냥 꼴리는대로 입력하면 안 되고, 잘 입력해야 한다.


2) xcode의 좌측 메뉴에서 프로젝트를 클릭해보면 Summary를 볼 수 있다. 여기에서 Bundle Identifier가 있는데 이를 위에서 생성한 App IDs의 Bundle Identifier와 동일하게 입력해준다.(만약 수정이 불가하게 되어있다면, 이에 맞추어 App IDs를 다시 생성해야겠지?)


3) xcode에서 summary 옆옆에 있는 Build Settings를 클릭하여 검색창에서 Code Signing을 검색해보면 해당 부분이 나온다. 이 부분에서 Code Signing Identity를 비롯한 아래에 선택할 수 있는 부분들을 자기가 받았던 프로비저닝으로 잘 선택이 되어있는지 확인하고, 잘 되어있지 않다면 제대로 선택해준다.



이 3단계를 거치니깐 드디어 device token 을 받아오게 되었다. 


이제 device token을 받아왔으니 본격적으로 push 기능 개발 고고싱!





뷰를 전환할 때 모달 뷰(Modal View) 형태로 띄우고 싶을 경우를 위해 포스팅을 해본다. 해놓고 나니 완전 기초 코드였고 도대체 내가 왜 헤맸을까 싶기도 했지만, 처음에는 모달 뷰라는 것이 뭔지도 몰랐고 어버버버 하다가 구글링에 구글링을 거듭해 겨우 해냈던거 ㅜㅜ

 

0. 목표

우선 하려고 하는 바를 정리해보면, 뷰를 2개 만들고, 뷰1에서 버튼을 클릭하면 뷰2가 모달 뷰로 나타나도록 하고 여기에 전환 효과를 살짝 넣어보는 것이다. 그리고 뷰2에서 닫기 버튼을 클릭하면 모달 뷰가 사라지고 다시 뷰1이 나타나게 한다.

 

1. 뷰 2개 생성하기

뷰를 2개 만들어준다. 처음에 프로젝트를 생성할 때 view based project로 생성하면, "프로젝트명ViewController"와 함께 스토리보드 혹은 xib파일이 생성되니 이미 뷰 1개는 만든 것이다. 그리고 뷰 하나 추가는 New File을 생성할 때 View Controller Subclass로 생성하면 .h, .m, .xib파일이 하나씩 생성된다. 이로써 뷰 2개 생성은 완료! 아래 코드에서는 편의상 뷰1의 뷰컨트롤러는 뷰1.h, 뷰1.m라 하고, 뷰2의 뷰컨트롤러는 뷰2.h, 뷰2.m 이라고 하자.

 

2. 뷰1 헤더파일(뷰1.h)에 메서드 선언

- (IBAction)popupSetting;

이 메서드는 뷰1의 스토리보드나 xib에 만들 버튼에 연결할 메서드이다. 헤더파일에 선언 한 다음에 스토리보드나 xib에서 버튼 만들고, control + 클릭해서 touch on inside 오른쪽 원 부분 클릭하고 끌어서 popupSetting에 연결하면 된다.

 

3. 뷰1 구현파일(뷰1.m)에 메서드 정의

#import "뷰2.h"

일단 뷰2를 모달 뷰로 띄울 것이기 때문에, 뷰2.h를 임포트!

- (IBAction)popupSetting
{
    Setting *modalSetting = [[Setting alloc]initWithNibName:@"Setting" bundle:nil];
    [modalSetting setModalTransitionStyle:UIModalTransitionStylePartialCurl]; //모달뷰 전환효과
    [self presentModalViewController:modalSetting animated:YES];
}

메서드 내부에는 딱 저 3줄만 있으면 된다. 심지어 2번째 줄은 전환 효과를 위한 것이고, 전환 효과를 디폴트로 주고 싶으면 굳이 입력하지 않아도 된다.

 

4. 뷰2 헤더파일(뷰2.h)에 메서드 선언

-(IBAction)closeSetting;

모달 뷰로 사용될 뷰2에는 해당 모달 뷰를 닫기 위한 버튼을 만든다. 위의 뷰1에서 했던 것 처럼, 메서드를 생성하고 버튼에 메서드를 연결시키면 된다.

 

5. 뷰2 구현파일에 메서드 정의

-(IBAction)closeSetting
{
    [self dismissModalViewControllerAnimated:YES];
}

모달 뷰 닫기 버튼에 대한 메서드는 심지어 단 한 줄!

 

이렇게 한 후에 빌드를 해보면 시뮬레이터에서 모달 뷰가 아름답게 떴다가 사라졌다가 하는 것을 볼 수 있다. 잘 안 되면 아마 버튼과 메서드를 연결을 시키지 않아서일 가능성이 높음...

 

** 모달뷰 전환효과 더 알아보기

기본적으로 사용할 수 있는 모달 뷰 효과는 총 4가지이다. 위에서 이미 사용한 효과는 종이를 말아 올리는 듯한 효과이고, 아래에 있는 3개 효과도 추가로 있다. (디폴트는 CoverVertical이다.) 

    [modalSetting setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    
    [modalSetting setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    
    [modalSetting setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

 

 

아이폰 수동 메모리 관리와 관련된 기초적인 내용.

그냥 읽으니깐 머리 속에 잘 안 들어와서 정리하는 겸 포스팅!

 

클래스/프로토콜 

메서드 이름

의미

 NSObject Protocol

 retainCount

 객체 혹은 인스턴스 변수가 특정 메모리 공간을 참조하고 있는가를 나타내주는 정수인 레퍼런스 참조 횟수 값을 저장.

 NSObject Class  alloc  생성된 객체에 메모리 공간을 할당. 객체에 메모리가 할당되면 retainCount 메서드에는 1이라는 값이 저장됨.
 NSObject Protocol  retain

 객체가 메모리 공간을 참조하고 있다는 사실을 아이폰에 알림. 메모리 주소는 가지고 있으나 메모리 공간을 사용할 수 없는 어떤 객체가 retain 메서드로 메모리 공간을 참ㅁ조하면 retainCount 메서드의 값은 1만큼 증가.

 NSObject Protocol  release

 객체가 현재 참조하는 메모리 공간을 더는 참조하지 말라는 명령을 내림. 실제로 release 메서드는 retainCount 메서드의 값을 1만큼 감소시킴.

 NSObject Class  dealloc

 메모리 공간을 참조하고 있는 모든 객체가 더는 해당 메모리 공간을 사용하지 말라는 명령을 내림. 어떤 조건이든 retainCount 메서드의 값이 0이 됨.

<참조 횟수를 관리하는 메서드>

 

alloc 메서드와 init 메서드를 통해서 하나의 객체가 생성되면, 사용자는 retain 메서드로 메시지를 보내 새로 생성된 객체가 메모리 공간을 참조하고 이를 사용할 권한을 가지고 있음을 알려주어야 한다(소유권). 또한 release 메서드는 객체가 지정된 메모리 공간을 참조할 필요가 없다는 것을 알려준다(소유권 반환). 정리하면 아래와 같다.

 1. 객체의 참조 횟수 값이 1 또는 그 이상일 경우 아이폰은 메모리 공간을 소유하고 사용할 수 있다.

 2. 객체의 참조 횟수 값이 0이 될 경우, 아이폰은 객체의 메모리 공간에 대한 소유권을 반환받아 할당되었던 메모리 공간을 회수한다.

 

객체의 메모리 할당, 참조, 반환 과정에 따른 참조 횟수의 변화를 보자.

먼저 Foo 클래스를 인스턴스화 하고, 메모리 공간을 할당한 첫 번째 객체 myFooOne을 만들어보자. 

 Foo * myFooOne = [[Foo alloc] init];   //retainCount = 1

이때 myFooOne 객체의 참조 횟수 값은 1이다. 이제 myFooOne 객체를 참조하는 두 번째 객체인 myFooTwo를 생성해보자.

 

 Foo * myFooTwo = myFooOne;    //retainCount = 1

 [myFooTwo retain];                   //retainCount = 2

첫 번째 줄은 myFooTwo 객체가 Foo 클래스를 인스턴스화 했으며 myFooOne 객체를 참조하도록 한다. 하지만 myFooOne 객체의 메모리 공간을 참조한다는 사실을 아이폰이 알고 있지는 않다. 따라서 메모리 공간의 참조 횟수 값은 여전히 1이다.

두 번째 줄에서는 retain 메서드를 사용하여 myFooTwo 객체가 myFooOne 객체와 같은 메모리 공간을 사용한다는 메시지를 myFooTwo 객체에 보낸다. 따라서 해당 메모리 공간의 참조 횟수 값은 2가 된다.

 

이제 myFooOne 객체와 myFooTwo 객체가 더 이상 필요하지 않다고 생가해보자. 이럴 때 사용자는 release 메서드를 사용하여 더는 해당 메모리 주소와 공간을 참조하지 않는다는 메시지를 myFooOne 객체와 myFooTwo 객체에 보낸다.

 [myFooOne release];    //retainCount = 1

 [myFooTwo release];   //retainCount = 0

이때 메모리 공간의 참조 횟수 값은 0이 되며, 아이폰은 myFooOne과 myFooTwo 객체가 함께 사용하던 메모리 공간을 회수한다.

 

 

 

출처 : iOS 앱 개발 시작을 위한 단계별 40개 예제 Objective-C 프로그래밍 (Mc Graw Hill 길벗 출판)


앱을 실행하는데 있어서, 간단한 설정값이나 데이터를 저장해야할 경우가 있다. 로그인이 필요한 앱의 경우에는 ID와 Password를 저장해야 할 것이고, 기타 설정들이 있을 경우 그 설정값들을 저장할 필요가 있다. 이 경우 별도의 DB를 이용하는 것이 아니라, 간단하게 값을 저장하고 불러와서 사용할 수 있다.


NSUserDefaults를 이용하면 되는데, 나도 자세한 내용은 모르므로 깊이있게 공부하고 싶다면 애플에서 제공하는 NSUserDefaults Class Reference를 참고하고, 여기서는 아주 간단하게 사용법만 소개!(혹시 틀리게 적은 내용이 있다면, 공격하진 마시구 조언 or 코멘트 부탁드립니다)



1. 설정값 저장하는 방법

아래 나와있는 코드처럼 작성하면 된다. setValue의 경우 id 형식으로 모든 데이터 타입을 담을 수 있고, forKey에는 String값으로 해당 데이터의 키값을 정하여 입력하면 된다.

[[NSUserDefaults standareUserDefaults] setValue:데이터 forKey:키값];


예를 들어 userID라는 이름의 textField에 입력되어있는 값을 saveID라는 키값으로 저장하고 싶다면 아래와 같이 입력하면 된다.

[[NSUserDefaults standardUserDefaults] setValue :userID.text forKey:@"saveID"];

 

그리고 Integer값으로 값이 바뀌었는지 안바뀌었는지 여부를 0 혹은 1로 저장하고 싶은 경우(키값은 isChange) 아래와 같이 입력하면 된다.

[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"isChange"];


그리고 아래 코드를 한 줄 더 입력하게 되면 값이 저장되는 듯하다

[[NSUserDefaults standardUserDefaults] synchronize];



2. 설정값 불러오는, 사용하는 방법

저장한 데이터를 불러오는 방법은 더 쉽다. 아래와 같이 한 줄 입력하면 해당 데이터를 바로 사용할 수 있다.

[[NSUserDefaults standardUserDefaultsstringForKey:키값]

[[NSUserDefaults standardUserDefaults] integerForKey:키값]


아까 위에서 저장했던 saveID 키값의 데이터를 불러오고 싶다면

[[NSUserDefaults standardUserDefaultsstringForKey:@"saveID"]


isChange키값의 데이터를 불러오고 싶다면 

[[NSUserDefaults standardUserDefaults] integerForKey:@"isChange"]

코드로 바로 데이터를 사용할 수 있다.



뭣보다 코드가 쉬워서 너무 좋은듯!



xcode에서 텍스트필드(TextField)를 생성할 때, 유저가 아이디와 패스워드를 입력하게 할 목적으로 생성하는 경우가 많이 있을 것 같다. 아주아주 쉽고 간단한 팁이지만, 처음에 의외로 찾기 힘들었던 텍스트필드(TextField) 비밀번호 형식으로 보이게 하는 법!

생성된 TextField를 클릭하고, 우측에서 Attribute 영역을 클릭한 후에 스크롤을 내리다보면 Secure 란이 있다. 아래 그림처럼 Secure 좌측의 체크박스에 체크표시를 하면 TextField를 입력할 때 비밀번호 형식으로 보이게 된다.