'iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍'에 해당되는 글 16건

  1. 2010.07.12 [iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 7. 탭바와 피커
  2. 2010.07.12 [iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 6. 멀티뷰 애플리케이션
  3. 2010.07.12 [iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 5. 자동회전과 자동크기조절
  4. 2010.07.12 [iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 4. 사용자 인터페이스, 좀 더 재미있게 만들기
  5. 2010.07.12 [iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 3. 기본적인 상호작용 다루기
  6. 2010.07.12 [iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 2. 티키신 달래기

[iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 7. 탭바와 피커

iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍 2010. 7. 12. 22:06

* 델리게이트와 데이터소스
- 피커는 여러 가지 작업을 델리게이에게 위임한다. 그 중에서도 가장 중요한 것은 각 행과 해당 행에 속한 컴포넌트 중에서 실제로 무엇을 그릴지를 결정하는 일이다. 피커는 델리게이트에게 문자열 또는 주어진 컴ㅁ포넌트의 특정 위치에 내용을 그리기 위한 뷰를 요청한다.

- 데이터소스는 피커에게 몇 개의 컴포턴트와 몇 개의 목록이 각각의 컴포넌트를 구성하고 있는지 알려준다. 데이터소스는 델리케이트와 유사한 방식으로 동작하지만, 메서드가 미리 정해진 시간에 호출된다는 점이 다르다.

* 탭바 아이콘
- 아이콘은 24 * 24 픽셀 크기여야 하고, .png 포맷으로 저장되어야 한다. 또 아이콘 파일은 투명 배경을 가지고 있어야 한다. 일반적으로 중간크기의 회색 아이콘이 탭바에서 가장 잘 어울린다.

* Tab Bar Controller
+ Tab Bar Item Attributes
-- Tab Bar Item
---- Badge = 이 옵션은 메일 애플리케이션에서 읽지 않은 메일이 몇 개인지를 나타낼 때 아이콘 위에 빨간색 숫자를 보여주는 것처럼 탭자에 빨간색 아이콘을 보여주기 위해 사용된다.
---- Identifier = 이것은 Favorites와 Search와 같은 일반적인 아이콘을 탭바에서 사용할 수 있도록 만들어 준다.

-- Bar Item
---- Title = 제목
---- Image = 사용할 이미지 파일

* 작업 순서
1. 탭을 클릭하고 속성 인스펙터를 사용하여 뷰 컨트롤러와 연결시킨 탭의 nib파일 이름을 입력
2. 아이텐터티 인스펙터를 열고 탭과 연결된 뷰 컨트롤러의 하위클래스를 변경
3. 탭바 아이템을 수정하기 위해 뷰 컨트롤러 대신에 탭을 한번 더 클릭하고 탭바 아이템의 텍스트와 아이콘을 설정

* Picker View
-- 날짜 피커와는 조금 다른점은 일반적인 피커는 자신이 어떤 데이터를 가지고 있는지를 알려주지 않는다. 데이터를 직접 보관하지 않기 때문이다. 대신 델리게이트와 데이터소스가 그 역할을 담당한다. 우리는 대신에 직접 피커에게 어떤 행이 선택되었는지 물어보고, PickerData 배열에 대응하는 데이터를 선택해야 한다.
-- viewDidLoad에서 우리는 피커에 데이터를 공급할 수 있도록, 여러 객체를 담을 수 있는 배열을 생성했다. 일반적으로 데이터는 프로젝트 폴더의 Resources폴더에 있는 프로퍼티 리스트 파일과 같은 소스들로부터 전달된다.

피커 구현에 필요한 새로운 메서드
* UIPickerViewDataSource에서 나온 공통으로 필요한 메서드

- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *) pickerView
{
    return 1;
}

--- 피커는 하나 이상의 회전판 또는 컴포넌트를 가질 수 있기 때문에, 이 방법을 사용해서 피커가 얼마나 많은 컴포넌트를 표시해야 할지를 물어볼수 있다. UI 피커가 매개변수로 전달되었다는데 주목하자. 이 매개변수는 우리가 요청을 하는 피커 뷰를 가리키는 매개변수로서, 이를 통해 동일한 데이터소스가 여러 개의 피커를 관리 할 수 있게 된다.

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [pickerData count];
}

-- 피커에게 해당 컴포넌트에 몇개의 행이 있는지를 물어보는 메서드

*UIPickerViewDelegate에서 나온 공통으로 필요한 메서드
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger) row forComponent:(NSInteger)component
{
    return [pickerData objectAtIndex:row];
}

-- 이 메서드에서 피커는 특정 컴포넌트에서 특정 행에 대한 자료를 제공하도록 요청한다. 우리는 요청받은 컴포넌트와 행의 정보와 함께 피커에 대한 포인터를 제공하면 된다.

* 2개 이상의 회전판 피커 구현시 델리게이트와 데이터 소스 예제
// 몇개의 회전판을 구성할것인가?
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
 return 2;  // 몇개의 회전판을 구성할것인가 ... 2라면 2개의 회전판이 존재하는 피커
}
 
// 어떤 회전판에 어떤 데이터소스를 사용할것인가?
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
   if(component == 0)
      return [self.breadTypes count];
   else
      return [self.fillingTypes count];
}
// 선택된 회전판에서 데이터 알아내기
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
   if(component == 0)
      return [self.breadTypes objectAtIndex:row];
   else
      return [self.filiingTypes objectAtIndex:row];
}

* 번들(Bundle)이란?
- 특별한 구조를 따르는 컨텐츠를 가진 좀 특별한 폴더의 일종. 애플리케이션과 프레임워크도 모두 번들이고, 이들을 호출하면 우리의 애플리케이션을 나타내는 번들 객체를 리턴하게 된다. NSBundle의 주된 용도는 프로젝트에 추가한 Resources폴더에서 리소스를 획득하는 것이다. 애플리케이션을 빌드할 때 이 파일들이 여러분의 애플리케이션의 번들로 복사된다.

* Dictionary로 file에서 데이터 가져오기
-(void)viewDidLoad
{
  NSBundle *bundle = [NSBundle  mainBundle];     //애플리케이션의 메인 번들에서 참조를 획득
  NSString *plistPath = [bundle pathForResource:@"statedictionary" OfType:@"plist"];
  NSDictionary *dictionary = [[NSDictionary alloc] initWithContensOfFile:plistPath];
  self.stateZips = dictionary;
  [dictionary release];
 
  NSArray *components = [self.stateZips allKeys];    
  NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
  self.states = sorted;
 
  NSString *selectState = [self.states objectAtIndex:0];
  NSArray *array = [stateZips objectForKey:selectedState];
  slef.zips = array;
}

* 피커의 선택이 변결될 때마다 메서드가 게속 호출된다.
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
  if(component == kStateComponent)
  {
    NSString *selectedState = [self.states objectAtIndex:row];
    NSArray *array = [statZips objectForKey:selectedState];
    self.zips = array;
    [picker selectRow:0 inComponent:kStateComponent animated:YES];
    [picker reloadComponent:kZipComponent];
  }
}
:

[iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 6. 멀티뷰 애플리케이션

iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍 2010. 7. 12. 22:06

* 탭바 / 툴바
- 탭바 : 두 개 이상의 대상 중 단 하나만 고를 때 사용한다. 실제 애플리케이션에서 탭바는 두 개 이상의 컨텐츠 뷰를 선택하기 위해서 사용
- 툴바 / 버튼과 다른 특정 컨트롤을 담을수 있지만 상호배타적이지 않다. 일반적인 작업을 수행하는 버튼을 나타내기 위해 사용된다. 툴바 버튼은 다른 아이폰 커트롤과 다른다. 툴바 버튼은 오직 하나의 액션만 지원하고 다른 아이폰 컨트롤의 Touch up inside이벤트 같이 적절한 순간에만 그 액션을 유발한다.

* -(void)viewDidLoad
- nib이 로드 될때 호출되는 UIViewController의 메서드이다. viewDidLoad 메서드는 상위클래스에 정의되어 있고 뷰의 로딩이 끝났을 때 호출되기 때문에 뷰의 로딩 완료 시점을 알고 싶은 클래스에서 재정의(overriding)한다.

* -(void)didReceiveMemoryWarning
- 아이폰 OS는 메모가 부족하여 시스템 자체적으로 메모리를 삭제하려고 결정할 때 뷰 컨트롤러에 의해 상속되는 UIViewController의 메서드인 didReceiveMemoryWarning 메서드를 호출한다.

* 전환시 애니메이션 주기
1. [UIView beginAnimations:@"view Flip" context:nil];
- 첫번째 인자는 애니메이션 블록의 제목이다. 이 제목은 애니메이션을 재생시키는 코어 애니메이션 프레임워크를 사용할때 참조한다.
- 두번째 인자는 (viod *)타입으로 이 애니메이션 블록과 결합시키려는 객체의 포인터를 사용한다.

2. [UIView setAnimationDuration:1.25f]
- 애니메이션의 속도를 결정

3. [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]
- 애니메이션 커브를 설정. 일정한 속도롤 진행 하는 선형 커브

4. [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]
- 트랜지션 설정 아이폰에서는 네개의 뷰 트랜지션을 선택 할수 있다.
+ UIViewAnimationTransitionFlipFromLeft
+ UIViewAnimationTransitionFlipFromRight
+ UIViewAnimationTransitionCurlUp
+ UIViewAnimationTransitionCurlDown

- 캐쉬(cache)옵션은 애니메이션을 시작할 때 뷰의 스냅샷을 직어서 매 단계마다 다시 그리지 않고 이미지를 사용해 뷰를 그리는 속도를 높여준다. 애니메이션을 진행하는 동안 뷰의 모습이 바뀌지 않으면 항상 캐시를 사용한다.

5. 트랜지션을 설정한 후 트랜지션할때 사용하는 뷰별로 각각 한번 씩 메서드를 호출한다.
- [self.blueViewController viewWillAppear:YES];
- [self.yellowViewController viewWillDisappear:YES];

6. 뷰 바꾸기가 끝나면 이 뷰들에 대해 두 번의 호출을 더 한다.
- [self.yellowViewController viewDidDisappear:YES];
- [self.blueViewController viewDidAppear:YES];

:

[iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 5. 자동회전과 자동크기조절

iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍 2010. 7. 12. 22:05

* 세로보기 모드 (portrait - 길고 얇은) / 가로보기 모드 (landscape - 짧고 옆으로 넓은)

* 세로보기 모드에서 뷰는 너비 320 px / 높이 460 px (상태 표시줄이 없다면 높이는 480 px)

* 가로보기 모드에서 너비는 480 px / 높이 300 px (상태 표시줄이 없다면 높이는 320 px)

* 애플리케이션에서 회전 기능을 관리하는 3가지 기능

-- autoSize속성으로 회전 처리 하기
-- 회전할때 뷰 재구성하기
-- 뷰 전환하기 (세로보기모드 / 가로보기모드)

* autoSize속성으로 회전 처리 하기
-(BOOL)shouldAutorotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
  return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
return 값에 지원하고자 하는 방향만 return YES를 설정해주면된다.

-- 4가지 방식으로 응답
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpSideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight


* 회전할 때 뷰 재구성하기
- willAnimateRorotationToInterfaceOrientation:duration: 메서드를 사용하면된다. 이메서드는 회전이 일어나면, 마지막 애니메이션 동작 전에 자동으로 호출된다.

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
 if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
 {
  button1.frame = CGRectMake(20, 20, 125, 125);
  button2.frame = CGRectMake(175, 20, 125, 125);
  button3.frame = CGRectMake(20, 168, 125, 125);
  button4.frame = CGRectMake(175, 168, 125, 125);
  button5.frame = CGRectMake(20, 315, 125, 125);
  button6.frame = CGRectMake(175, 315, 125, 125);
 } else {
  button1.frame = CGRectMake(20, 20, 125, 125);
  button2.frame = CGRectMake(20, 155, 125, 125);
  button3.frame = CGRectMake(177, 20, 125, 125);
  button4.frame = CGRectMake(177, 155, 125, 125);
  button5.frame = CGRectMake(328, 20, 125, 125);
  button6.frame = CGRectMake(328, 155, 125, 125);
 }
}

- 버튼과 같은 컨트롤들을 포함해서, 모든 뷰의 크기와 위치가 CGRect타입의 구조체인 frame이라는 속성에 명시되어 있다. CGRectMake는 CGRect를 쉽게 만들기 위해서 애플이 제공하는 함수로서, 너비와 높이와 함께 x,y위치를 명시하기만 하면된다.

* 뷰 전환하기
- 템플릿을 통해 제공되는 뷰는 크기를 조절 할수 없다.

---------------------------------------------------------------
P113 작업중  자꾸 아래와 같은 메세지가 console에 출력되었다.
당연히 Simulator에서도 작동하지 않았고.. 그래서 다음 이미지와 같이 해결하였다.


*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SwapViewController" nib but the view outlet was not set.'

1. 새롭게 추가된 view중 portrait에 UIView portrait도 연결하였지만 기본 view도 같이 연결해 주었다.
:

[iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 4. 사용자 인터페이스, 좀 더 재미있게 만들기

iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍 2010. 7. 12. 22:05

* 인터페이스 빌더 중 Library 항목에 Image View
-- 드로잉(Drawing) 체크 박스
--- Opaque :  불투명 항목 - 아이폰 OS에게 이 뷰 밑에 있는 것은 그릴 필요가 없고 컨트롤을 그릴때 몇 가지 방법으로 최적화를 해서 속도를 높일 수 있게 한다.
--- Hidden : 숨김 - 사용자는 그 컨트롤을 볼 수 없다.
--- Clear Context before Drawing - 실제 컨트롤을 그리기 전에 컨트롤러의 전체 영역을 모두 지운 뒤에 그릴게 될 것이다.
--- Clip Subviews : 하위뷰 자르기 - 체크하면 부모 영역 안의 하위뷰만 그린다. 체크 하지 않는 것이 기본값
--- Autoresize Subviews - 뷰의 크기가 변경되면 하위뷰의 크기도 변경되도록 설정한는 기능

-- Interaction : 상호작용
--- User Interaction Enabled : 사용자가 이객체와 무엇인가를 할 수 있는지를 설정한다. 체크 하지 않으면 그 컨트롤은 어떤 액션 메서드도 유발할 수 없기다.
--- Multiple Touch : 컨트롤이 멀티터치 이벤트를 받을 수 있는지를 결정한다.

* 인터페이스 빌더 중 Library 항목에서 Text Field
-- Text Field
--- Placeholder : 텍스트 필드 안에서 회색으로 표시할 텍스트를 설정
--- Clear When Editing Begins :  텍스트를 입력하려고 테스트 필드를 선택했을때 기존에 있던 값을 지우고 새롭게 입력을 시작
--- Text Input Traits
------ Capitalize : 입력되는 순서에 따른 대문자 표시여부
------ Auto-enable Return Key : 텍스트 필드에 한 글자 이상을 입력할 때까지 리턴 키는 비활성화 상태를 유지
------ Secure :텍스트 필드의 글자를 보여줄 것인지를 결정하는 옵션

* Done을 누르면 키보드 사라지게 만들기
- 아이폰의 키보드는 물리적인 키보드가 아닌 소프트웨어 기반의 키보드 이다.  사용자가 Done버튼을 누르면 "Did end on Exit" 이벤트가 생성된다. 그때 텍스트 필드가 제어를 포기하면 키보드가 사라진다.
- 퍼스트 리스폰더(first responder)의 개념은 '사용자가 현재 상호작용 중인 컨트롤'. 이 메서드에서 어떤 컨트롤이든 이 액션을 유발하면 퍼스트 리스폰더 상태를 포기하게 만든다. 텍스트 필드가 퍼스트 리스폰더임일 포기하면 키보드는 사라진다.
- .h 파일에 아래 추가
-(IBAction) textFieldDoneEditing: (id) sender

- .m 파일에 아래 추가
-(IBAction) textFieldDoneEditing: (id) sender
{
  [sender resignFirstResponder];
}

* 액션 메서드를 호출할 수 있는 모든 컨트롤 들은 UIControl의 하위클래스이다.

* UISegmentedControl의 selectedSegmentIndex 속성은 현재 선택된 세그먼트의 인덱스를 정수로 알려준다. 분할 컨트롤의 첫 번째 세크먼트인 Switches의 인덱스 값은 0이다.

* 액션 시트는 사용자에게 2개 이상의 항목에 대해 강제적인 선택을 받고자 할 때 사용된다.
-- 액션 시트는 화면의 아래 쪽에서 나타나며 사용자의 선택을 받기 위한 여러 버튼들로 구성된다. 사용자는 버튼 중 하나를 선택하기 전까지는 더 이상 진행할 수 없다.
-- 액션 시트를 사용하기 위해서는 컨트롤러 클래스가 델리케이트를 사용하면서 클래스가 UIActionSheetDelegate프로토콜을 따르게 해야 한다.

 UIActionSheet *actionSheet = [[UIActionSheet alloc]
          initWithTitle:@"Are you sure ?"
          delegate:self
          cancelButtonTitle:@"No Way!"
          destructiveButtonTitle:@"Yes, I'm Sure!"
          otherButtonTitles:nil];
 [actionSheet showInView: self.view];
 [actionSheet release];

+ 첫번째 인자(initWithTitle) : 액션 시트의 제목
+ 두번째 인자(delegate) : 액션 시트의 델리게이트는 시트에 있는 버튼을 눌려졌을때 알려주는 역할을 한다. 좀더 구체적으로 actionSheet:didDismissWithButtonIndex: 메소드가 호출
+ 세번째 인자(cancelButtonTitle) : 사용자가 더 이상 진행을 원치 않을 때 사용될 버튼에 제목을 설정.
+ 네번째 인자(destructiveButtonTitle) : 종료 버튼에 사용될 제목
+ [actionSheet showInView:self.view] = 액션 시트 생성 후에 화면 상에 액션 시트를 출력하는 코드


* 경고창은 화면의 중앙에 나타나며 파란 색의 둥그스름한 사각형 모양을 하고 있다.
--경고창도 액션 시트처럼 애플리케이션을 계속해서 진행하기 전에 사용자의 응답을 받는 용도로 사용된다.

-(void) actionSheet: (UIActionSheet *) actionSheet didDismissWithButtonIndex: (NSInteger) buttonIndex
{
 if(buttonIndex != [actionSheet cancelButtonIndex])
 {
  NSString *msg = nil;
  
  if(nameField.text.length > 0)
   msg = [[NSString alloc] initWithFormat:@"You can breathe easy, %@, everything went OK.",nameField.text];
  else 
   msg = @"You can breathe easy, everything went OK.";
  
  UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle:@"Something was done"
         message:msg
         delegate:self
         cancelButtonTitle:@"Phew!"
         otherButtonTitles:nil];
  [alert show];
  [alert release];
  [msg release];
 }
}
:

[iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 3. 기본적인 상호작용 다루기

iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍 2010. 7. 12. 22:05

시작하세요~~~!! 아이폰3 프로그래밍 - Part3 [기본적인 상호작용 다루기]
+ 아웃렛
+ 액션

* 컨트롤러 클래스는 아웃렛 (Outlet)이라 불리는 특별한 인스턴스 변수를 사용하여 nib(xib) 파일 안의 객체를 참조 할수 있다. 아웃렛은 nib파일 내부의 객체를 가리키는 포인터라 생각하면 된다.
-- 예를 들어 인터페이스 빌더에서 텍스트 레이블 하나를 생성하였고 코드 내부에서 레이블의 텍스를 변경하려 한다고 한다면 아웃렛을 하나 선언하고 아웃렛이 레이블 객체를 가리키게 함으로써 코드상에서 아웃렛을 사용하여 레이블의 텍스트를 변경할 수 있다.

* nib 파일 안의 인터페이스 객체는 컨트롤러 클래스의 특정 메서드가 호출되도록 설정할수 있다. 이것은 액션(Action) 메서드
-- 예를 들어 사용자가 버튼을 눌렀을때 코드 안에 특정 액션 메서드가 호출될 것이라고 인터페이스 빌더에게 알려 줄수 있다.

* 아웃렛은 IBOutlet 키워드를 사용하여 선언하는 인스턴스 변수들이다.
@property (nonatomic, retain) IBOutlet UIButton *myButton;
-- IBOutlet의 목적은 인터페이스 빌더에게 이것은 nib 파일 안에 있는 객체와 연결되는 인스턴스 별수라고 알려주는 힌트를 제공하는 것뿐. 컴파일러와 관련해서는 아무 일도 하지 않는다. 인터페이스 빌더를 열었을때, 인터페이스 빌더는 프로젝트의 헤더 파일로부터 이 키워드를 검색하여 IBOutlet이 붙은 변수들을 nib 안의 객체와 연결되게끔 도와준다.

* 액션은 IBAction이라는 특별한 키워드로 선언. 이 키워드는 메서드가 액션 메서드라는 것을 인터페이스 빌더에게 알려주고, 컨트롤이 메서드를 호출하게뜸 도와준다.
-- '-(IBAction) doSomething: (id) sender; '
-- IBAction은 void 리턴 타입을 선언한 것과 같다고 할수 있다. 액션 메서드는 변수 값을 리턴하지 않는다는 말. 액션 메서드를 호출하는 버튼 컨트롤은 sender인자를 통해 자기 자신의 포인터를 넘겨준다. 이때 sender인자는 방금 눌러진 버튼의 포인터 값을 가지고 있다.
-- sender라는 이름의 변수를 하나를 인자로 취하지만 이 sender는 특별한 어떤 컨트롤을 가리키는 것은 아니다. 어떤 컨트롤이라도 이 sender를 통하여 전달 될 수 있다.

* @property / @synthesize
-- @property 선언은 구현부 파일 안의 또 @synthesize와 결합하여 컴파일러에게 게터와 세터 메서드를 컴파일 시에 생성하도록 알려준다.
-- @property (nonatomic, retain) IBOutlet UILabel *statusText;
-- 속성중 retain은 컴파일러에게 이 속성을 통해 할당한는 모든 객체에게 retain 메세지를 보내라고 알려준다. 이것은 프로터피로 선언된 인스턴스 변수가 여전히 사용되고 있는 중에는 메모리에서 삭제되는것을 막아준다. int, float혹은 다른 기본 데이터 타입을 선언할 때에는 어떠한 선택적인 속성들을 명시할 필요가 없다.
-- 속성중 nonatomic은 기본적으로 접근자와 변경자는 멀티스레드 프로그맹을 작성할 때 도움이 될 수 있는 추가적인 코드들과 함께 생성된다. 추가적인 오버헤드들은 비록 크지는 않지만 하나의 사용자 인터페이스 객체를 가리키는 포인터를 선언하는 경우에는 불필용한 것들이므로 오버헤드를 줄이기 위해 nonatomic를 선언

* IBAction sender 인자에서 부터 할당된 값 참조 - 클릭된 버튼의 제목을 얻는 코드
-- NSString *title = [sender titleForState:UIControlStateNormal];

** 자동으로 릴리지 되는 객체
-- NSString *newText = [NSString stringWithFormat:@"%@ button pressed.", title];
-- NSString 클래스의 이름과 같은 이름의 메서드를 명시하는 것은 컨비니언스 메서드나 팩토리 메서드를 호출하는 것과 같으며 이 메서드들은 자동으로 릴리즈되는 객체를 반환한다.
-- "만약 여러분이 메모리를 할당하거나 리테인 하지 않는다면 그 메모리를 릴리즈해서는 않된다."

* 델리게이트
-- 델리게이트라는 것은 다른 객체를 대신해서 책임지고 어떤한 일을 해주는 클래스를 말한다.
-- 모든 아이폰 애플리케이션은 델리케이트 메서드와 단 하나의 UIApplication 인스턴스를 가진다. UIApplication 인스턴스는 애플리케이션의 메인 루프를 책임지며 입력된 데이터를 적합한 컨트롤러 클래스에게 전달해즈는 것과 같은 애플리케이션 수준의 기능을 처리.
-- 예를 들어, 프로그램이 종료하기 직전에 동작시키려는 코드가 있다면, 애플리케이션 델리케이트 안의 ApplicationWillTerminate메서드를 구현하고 그 안에 종료 코드를 작성해야 한다.
:

[iPhone] - 시작하세요! 아이폰 3 프로그래밍 - Part 2. 티키신 달래기

iPhone/[위키북스]시작하세요! 아이폰3 프로그래밍 2010. 7. 12. 22:05

아직 해당 책이 내가 구매한것이 아니라서..ㅋㅋ
난 원래 낙서를 많이 하면서 책을 보는데.. 그러지 못하니 여기에다가 중요한것만 대략적으로 정리..

Part1은 대략적인 개념이라 패스.. 정리 할게 없다... 바로 Part2로 고고

Part2는 모든 프로그램에 기본.. "Hello World"출력하기...
- 아이폰 기본 아이콘은 57 * 57 png파일이 기본이다.
- 아이콘 파일을 Xcode에서 왼쪽 Group & File중 Resources에 아래에 복사를 해 놓고.. 이것이 기본 아이콘 파일 이라고 설정해 줘야 한다.
- Resources 디렉토리에 있는 .plist파일을 열어서 그중 Icon File TextInput에 해당 파일명을 지정해 주면된다.

: