* 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 : 작은 쪽에 맞춰줌
. 가로/세로 비율을 맞춰서 확대/축소