* View의 생성방법

  1. 코드로 생성하는 방법  
     - UIView * 객체명 = [[UIView alloc]initWithFrame : (CGRect)rect];
        rect 부분은 CGPoint Origin(CGFloat x, y), 또는 CGSize Size(width, height) 등으로도 가능
     - [window 객체 addSubview : 뷰 객체명];
     - 코드로 생성시, xib 파일을 사용하는 부분이라면 m 파일의 loadview 부분에서 생성하면 안되고 viewDidLoad 부분에서 해야 한다.

- (void)viewDidLoad 
{
UIButton * button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 150, 30)];

[button setTitle:@"버튼" forState:UIControlStateNormal];   // 버튼의 초기 타이틀 설정. 

[self.view addSubview:button];   // 버튼을 현재 뷰 컨트롤러의 뷰의 서브뷰로 초기화함
[button release];    // SubView가 NSArray * 타입이라서 추가나 제거가 될 때 
                                    // retain과 release를 자동으로 수행하게 된다.
                            // 따라서 임시 변수를 이용해서 대입했다면 반드시 release를 해야 한다.
[button addTarget:self action:@selector(redView) forControlEvents:64];    // 버튼의 TouchUpInside  
                                                                                                                   // 이벤트에 redView 메소드를 
                                                                                            // 연결
    [super viewDidLoad];
}

-(void)redView
{
self.view.backgroundColor = [UIColor redColor];
}

  2. 인터페이스 빌더로 생성하는 방법
     - 인터페이스 빌더로 뷰를 생성하고 IBOutlet으로 멤버 변수와 연결한다
     - 만들기는 가장 쉬우나 사후 관리가 귀찮음

  3. UIView로부터 상속받는 클래스를 생성해서 사용자 정의 뷰를 만든 후 사용하는 것
     - 사람마다 필요로 하는 기능이 모두 조금씩 다를 수 있기 때문
     - 만들고자 하는 것이 기본적인 모양이 아닐 경우 이 방법을 사용해 만든다
     - 주로 테이블 뷰에 가장 많이 사용하게 된다(사람들마다 셀을 사용하는 형태가 다르기 때문)


* Objective-C의 콜렉션 : NSArray, NSDictionary, NSSet
  - 삽입이나 삭제시에 retain 과 release 이용


*  IBAction과 void는 기본적으로 같다. 인터페이스 빌더에서 인식하느냐 못하느냐의 차이일 뿐. 둘 다 리턴값이 없다.


* 인터페이스 빌더의 버튼 이벤트를 코딩으로 구현하려면 열거형으로 해서 값을 줘도 된다. (UIControlEvents 도움말에 잘나와있음)


* 앱 만들때 배경그림 까는 법
  - 인터페이스 빌더에서 Image View를 배경화면 크기로 깔아버리고 시작


* NSArray 오브젝트들의 배열

  1. 생성
    arrayWithObject : 객체
    arrayWithObjects : 객체 나열, nil
    arrayWithArray : 배열명

NSArray * ar = [NSArray arrayWithObjects : @"1", @"2", @"3", nil];
NSArray * ar1 = [NSArray arrayWithArray : ar];    <-- COPY이다.

ar1 = ar;
ar1 = [ar retain];      <-- 동작결과는 똑같지만 이게 더 좋은 방식. release에 있어서 더 자유롭다.

  2. 초기화
   array -> init
   공간은 있지만 데이터가 없는 경우임

  3. 추가 및 삭제
   -(NSArray *) arrayByAddingObject : 객체
   -(NSArray *) arrayByRemove : 객체

원래 3까지 있는 배열 ar을 만들고

[ar arrayByAddingObject : @"4"] <-- 이렇게 하면 가상본을 만들어서 4를 추가한다.
ar = [ar arrayByAddingObject : @"4"] 로 하여 다시 한번 ar에 집어넣어야 한다.

추가를 해서 처음에 정해진 배열크기보다 큰 부분에 데이터가 들어오면 자동적으로 원래 배열이 아니라 다른 곳에 큰 배열을 만들어서 추가해 버린다(위에서 말한 가상본). 실제 기기에서는 이런 부분이 메모리를 낭비하게 되어 아주 치명적인 누수를 일으킨다. 따라서 위의 방법은 사용하지 않는다.

NSArray * temp = [ar arrayByAddingObject : @"4"];
...
[ar release];

ar = [temp retain];
[temp release];

이것이 Objective-C에서 가장 일반적으로 배열을 만들고 추가/삭제를 하는 방법이다.

  4. 멤버 접근

   1) index 이용 :
      -(id)ObjectAtIndex:(id)index
      멤버 접근에 가장 쉽고 일반적인 방법

   2) Enumerator 이용:
      -(NSEnumerator *)ObjectEnumerator
      반복자. 어떤 형태의 멤버에든 접근하기 쉽게 하기 위해서 만들어진 것.
      배열은 규칙적으로 반복되기 때문에 읽기가 쉬우나, 실제 프로그램 작성시에는 그렇게 자료가 규칙적인 경우가 많지 않다.
      이 때문에 반드시 배워야 하는 개념이 Linked List. 이 경우에는 규칙적이지 않으므로 인덱스를 사용하지 못한다.
      무엇인가에 각각의 멤버의 주소만 전부 가지도록 하게 만들면 그 이후부터는 그것만으로 모든 멤버를 참조할 수 있다
      
NSEnumerator * 변수 = [ar ObjectEnumerator];

id sender;

while((sender = [변수 nextObject])!=nil)
{
...
}

   3) for ~ in 사용가능:

id sender;   // <-- 데이터 타입이 무엇이 들어있을지 모르기 때문에 대부분의 타입을 받을 수 있는 id 형을 사용

for(id sender in ar)

    자료들의 크기가 커지면 커질수록 속도면에서 유리해지는 방법이다.


  5. 배열의 요소 개수

    -(NSInterger) count



* 2차원 배열

  - Objective-C에서는 기본적으로 2차원 배열이 없다.
  - 때문에 2x2의 배열을 만든다고 할 경우는 이렇게 한다.

NSArray * ar1 = [NSArray arrayWithObjects: @"1", @"2", nil];
NSArray * ar2 = [NSArray arrayWithObjects: @"3", @"4", nil]; // 2개의 1차원배열을 만든 뒤

NSArray * ar = [NSArray arrayWithObjects: ar1, ar2, nil]; // 그 배열 2개를 모아 다른 배열을 선언

[ar1 release];
[ar2 release];

  - 주의

NSArray * copyAR = [NSArray arrayWithArray: ar];
ar = [ar arrayByAddingObject: ar3];
[[ar ObjectAtIndex: 0] arrayByAddingObject: @"10"];

  - 흔히 얕은 복사라고 함. 한번의 복사만을 해준다.
  - 이것을 방지하기 위해서는 메모리 상의 처리보다 파일처리 같은 외부 기억장소로 빼내서 처리하는 방법을 이용하는 것이 좋다


* ImageView

  - 이미지 한 장을 화면에 출력하기 위한 정적인 뷰. 이벤트 사용할 수 없다
  - Image 속성을 이용해 이미지 리소스를 연결한다
  - contentMode 속성으로 배치 모양을 결정한다
      UIViewContentModeScalToFill : 프레임의 긴 쪽에 맞춰서 확대/축소
      ScaleAspectFit : 작은 쪽에 맞춰줌 . 가로/세로 비율을 맞춰서 확대/축소

+ Recent posts