본문 바로가기

프로그래밍/iOS

iOS 키보드 숨기는 방법 1. resignFirstResponder 사용 - textView에서 직접적으로 사용해야 함 //사용법 [textView resignFirstResponder]; 2. endEditing:(BOOL)force 사용 - textView를 포함하는 뷰에서 사용하여도 하위 뷰들의 키보드 처리를 알아서 해줌 - 매개변수는 optionally한 값으로 강제 처리에 관련된 값이다. - (void)viewDidLoad { [super viewDidLoad]; [self.view setBackgroundColor:[UIColor grayColor]]; UITextView *txtView = [[UITextView alloc] initWithFrame:CGRectMake(100.0f, 100.0f, 100.0f, 30.. 더보기
GCD(Grand Central Dispatch) 사용 GCD : Grand Central Dispatch - iOS 4부터 지원하는 스레드 관리 기술 - 블록 코딩 기반으로 NSThread, NSOperation보다 쉽게 사용 가능 GCD Queue - 실행할 작업을 저장하는 큐로 작업을 정의하고 큐에 넣으면 나머지는 OS에서 알아서 처리 - 블록의 경량화 된 리스트라고 생각하면 됨 - Dispatch Queue 1) 시리얼 디스패치 큐(Serial Dispatch Queue) * 한 스레드에서 하나의 작업 씩 순차처리(FIFO)하며 처리 외 작업들은 대기 * 호출 할 때 마다 스레드가 추가되므로 과도하게 호출 할 경우 성능에 문제가 생길 수 있음 2) 컨커런트 디스패치 큐(Concurrent Dispatch Queue) * 작업들을 순서와 상관없이 별도의.. 더보기
KVC(Key-Value Coding) & KVO(Key-Value Observing) KVC(Key-Value Coding) - NSObject에 NSKeyValueCoding.h가 카테고리로 포함되어있어 NSObject만 상속받더라도 사용 가능 - NSDictionary처럼 문자열로 된 key를 사용하여 객체의 속성값에 간접 접근하는 방법. - 코드가 간결해지고 유지보수가 쉬움 - 클래스간 의존성이 낮아짐 - 객체 형태로만 주고받음 1) ex: NSInteger → NSNumber형으로 return하므로 intValue 사용하여 형변환 필요. - 직접 접근하는 방법에 비해 느림(많은 과정을 거침) - 객체 접근 과정 1) key로 들어온 문자열과 같은 이름의 메소드 확인. 2) 비슷한 getter 메소드 확인(없을 경우 이 이름의 property가 없음) 3) 배열과 관련된 index,.. 더보기
비동기 처리방법 및 장/단점(GCD 제외) 비동기 처리 - 소요시간이 오래 걸리는 작업을 백그라운드에서 처리하여 메인 스레드에 반영. - 동시에 여러 작업을 하거나 지속적인 모니터링이 필요한 작업에 사용. 1) 웹 상의 이미지 다운로드 2) 데이터 파싱 3) 채팅관련 푸시 모니터링 등 비동기 처리 방법 - 비동기 디자인 패턴 : delegate, @selector, block, Notification - NSThread 1) NSOperation보다 우선순위 관리가 좋음 2) 사용 방법 1] 상속: main() 메소드를 overriding, 인스턴스 생성 후 start() 메소드 실행. 2] 클래스메소드: 실행 할 작업을 메소드에 구현, 인스턴스 생성 후 start() 메소드 실행. 3] detachNewThreadSelector - 클래스메소드.. 더보기
setNeedsLayout VS layoutIfNeeded / setNeedsDisplay VS layoutIfDisplay setNeedsLayout - 호출 시 needsLayout flag가 YES로 변경. - 호출 즉시 뷰가 적용되는 것이 아니라 다음 run loop에 뷰 변경이 적용 - 여러 부분에서 호출하더라도, 다음 run loop에서 한번만 적용 - layoutSubview가 호출 됨 layoutIfNeeded - 호출 시 needsLayout flag를 체크하여 YES인 경우 뷰 변경을 즉시 적용. - 호출 즉시 뷰 변경을 적용하기 때문에 여러 부분에서 사용할 경우 성능상의 문제가 생길 수 있음 - layoutSubview가 호출 됨 setNeedsDisplay - 호출 시 needsDisplay flag가 YES로 변경. - 호출 즉시 뷰가 적용되는 것이 아니라 다음 run loop에 뷰 변경이 적용 - 여러.. 더보기
Run Loop Run Loop - 이벤트 처리를 위한 loop로 입력소스와 타이머소스를 주로 처리. 1) 입력소스(input source): 다른 thread나 어플리케이션에서 전달되는 메시지 이벤트(비동기식) 2) 타이머소스(timer source): 예정시간이나 반복수행간격에 따라 발생하는 이벤트(동기식) - 앱을 계속 살려두기 위함 - 할 일이 많을 때는 thread를 바쁘게, 할 일이 없을 때는 쉬게 하는 것을 목적으로 함 - Main thread에서 생성된 Main run loop 이외의 경우 사용자가 직접 추가해야 함 - 지속적 장호작용이 필요한 경우 반드시 사용(ex: 통신, 타이머) - 사용자 이벤트(user interaction)발생 및 처리과정 1) 이벤트 발생(터치, 키보드 등) 2) 시스템에서 p.. 더보기
NSHashTable HashTable - 저장할 값 또는 키값을 통해 테이블 내의 주소를 계산하고 그 곳에 값을 저장하는 구조. 1) hashFunction(저장값 또는 키) % 테이블 사이즈 = 저장할 index - 탐색 시에도 같은 방법으로 index를 찾아 데이터 탐색 - hashFunction을 한번만 호출하면 값의 위치를 찾을 수 있어 빠름 - 값에 따라 index가 충돌할 수 있음(collision) - collision 처리(index 충돌) 1) separate chaining : 이미 값이 저장된 index에 linkedList를 통해 node에 값 추가. (JDK 1.8에서는 node가 8개 이상일 경우 트리 구조로 변경) 2) resizing: 테이블 사이즈를 더 크게잡고 재분배 - 충돌되어 chaini.. 더보기
NSAutoreleasePool VS @autorelease block NSAutoreleasePool - MRC에서 사용하는 autorelease 메시지를 받은 객체들을 모아두는 풀 - 풀이 메모리에서 해제(drain, release)될 때 풀에 포함된 모든 객체들은 release 메시지를 받음 - 풀은 release 메시지를 한번만 보내기 때문에, retain count가 2인 객체는 살아있음 - 기존 풀에 새로운 풀 생성 1) 기존 풀에 새로운 풀을 생성 할 경우 기존 풀 스택의 맨 위에 추가 2) 이후 어떤 객체가 autorelease 메시지를 받게 된다면, 그 객체는 최 상단에 포함된 풀에 추가 - drain VS release 1) Gargage Collection을 지원하지 않는 경우(iOS) drain은 release와 같음 2) Gargage Collecti.. 더보기
iOS 식별자(identifier) iOS 기기 식별자(UDID: Unique Device Identifier) - iOS에서 기존에 사용하던 UDID가 iOS5에서 deprecated 됨. - 따라서 UUID(Universally Unique Identifier) 기반의 다른 식별자로 대체하여 사용 - 대표적으로 identifierForVendor(벤더식별자), advertisingIdentifier(광고식별자)가 있음. - 32개의 문자+숫자로 이루어 짐(ex: E621E1F8-C36C-495A-93FC-0C247A3E6E5F) identifierForVender(벤더식별자) - 공급업체(벤더)가 같은 앱들은 모두 같은 고유 ID를 가짐 - 앱을 삭제할 경우 1) 같은 벤더의 다른 앱이 설치되어 있는 경우 ID가 유지됨. 2) 같은 벤.. 더보기
NSURL의 속성 NSURL의 속성 - URL: http://www.testUrl.com/notice/contents?a=1&b=2&c=3 (설명을 위한 임시 URL) - scheme: http (:// 이전의 텍스트) - host: www.testUrl.com (://과 맨 처음 / 사이의 텍스트) - path: /notice/contents (맨 처음 /와 ? 사이의 텍스트) - query: a=1&b=2&c=3 (? 이후의 텍스트) 예제 코드 NSString *strUrl = @"http://www.testUrl.com/notice/contents?a=1&b=2&c=3"; NSURL *requestURL = [NSURL URLWithString:strUrl]; ///////////////////////////////.. 더보기