서버를 구축했으니, Xcode에서 이용을 해야겠죠? 편리하게도 Xcode는 SCM 이라는 것을 자체 지원합니다. 요 SCM덕분에 우리는 약간의 설정만으로 힘들이지 않고 클라이언트단에서 버전관리를 할 수 있습니다. 자. 그럼 지금부터 SCM 설정을 시작합니다. 먼저 Xcode를 실행시키고 메뉴바에서 SCM탭을 찾아, 거기서 Configure SCM Repositories 를 선택해 줍니다. 그러면 아래와 같은 창이 뜨는데, 우리는 여기서 왼쪽 하단의 + 버튼을 눌러 SCM Repository를 추가해 주어야합니다. 생성창에서 이름과 시스템을 설정해줍니다. 시스템은 Subversion을 선택해 줍니다. 그럼 스샷과 같이 Repository가 하나 생성되고 오른쪽에 설정창이 뜹니다. 여기에는 정해진 URL을 ..
참고 사이트 아이폰 개발센터 의 Introduction to Event-Driven XML Programming Guide for Cocoa 와 블로그 http://cocoadev.tistory.com/245 를 참고 하였습니다. 1. 접속 NSURL *url = [[NSURL alloc] initWithString:@"http://sites.google.com/site/iphonesdktutorials/xml/Books.xml"]; NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 대상 XML (NSString 타입)의 주소를 인자로 NSURL 을 생성한다. NSXMLParser 오브젝트를 수신된 url을 인자로 초기화 ..
xcode 를 이용하여 아이폰에서 돌아가는 간단한 계산기를 만들어 보자~^^!!!!!! 1. xcode 를 실행하여 New Project 에서 iPhone OS 의 Application 에서 Window-based Application을 선택한다. 2. 프로젝트 이름은 각자 알아서 정하고, 프로젝트가 생성되면 Resources-iPhone 디렉토리의 MainWindow.xib 파일을 더블클릭한다. 3. Interface Builder 가 실행되면 Library 창에서 Object를 선택하고 버튼 과 텍스트필드를 드래그해서 Window 창에 계산기 폼을 만든다. 4. 각 버튼 및 텍스트 필드에 연결될 Outlet 들을 Library 창에서 Classes 를 선택한 후 다음과 같이 Outlet 을 만들어준..
컬렉션 프로퍼티 리스트 클래스 (NSArray, NSDictionary)는 프로퍼티 리스트를 파일로 기록해주는 - writeToFile: atomically: 메소드를 가지고 있다. NSArray *phrase; phrase = [NSArray arrayWithObjects: @"Hello", @"my", @"name", @"is", @"jesica", nil]; [phrase writeToFile: @"/tmp/test.txt" atomically: YES]; 위 소스는 xml 파일 형식으로 Hello, my, name, is, jesica 를 순차적으로 저장한다. 저장된 test.txt 파일은 + arrayWithContentsOfFile: 메소드로 읽을 수 있다. NSArray *phrase2 = ..
NSDate 와 NSData 는 이름이 같아서 같이 올리는게 아니다.^^;; 코코아(?)에는 plist라 불리는 클래스 객체들이 있는데 이를 프로퍼티 리스트 (property list) 라 부른다. 프로퍼티 리스트 클래스에는 NSArray, NSDictionary, NSString, NSNumber, NSDate, NSDate 가 있다. 먼저 NSDate 는 날짜 및 시간 처리를 위한 핵심적인 클래스이다. Ex) NSDate *date = [NSDate date]; NSLog (@"today is %@", date); 이 코드는 "today is 2010-02-10 13:16:02 -0400" 을 출력한다. Ex) NSTimeInterval secondsPerDay = 24 * 60 * 60; NSDat..
프로퍼티 (property)란 - 외부에서 접근할 수 있는 객체의 속성 Objective-C에서는 인스턴스 멤버 변수들의 값에 편리하게 접근하기 위해 @property 라는 지시어를 사용한다. 선언 방식은 다음과 같으며 @interface 내부에 선언 된다. - @property(속성) 타입 변수명; -(float)value; -(void)setValue:(float)newValue; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @property float value; 이와 같이 두가지 메서드를 선언한 것과 같은 기능을 하게 된다. 속성에는 다음과 같은 정의를 할 수 있다. readwrite (Default) property의 값을 읽고 쓸 수 있다는 것이다. readonly property의 값..
+ (id) stringWidthFormat: (NSString *) format, ...; 메소드를 + 기호로 선언했다면 그 메소드를 클래스 메소드라고 표시한 것이다. 이 메소드는 클래스 객체(클래스의 인스턴스 객체와는 다름)에서 왔으며 주로 클래스의 새로운 인스턴스를 만드는데 사용된다. 클래스 객체는 수퍼클래스와 클래스 이름을 가리키는 포인터, 그리고 클래스 메소드 목록을 가리키는 포인터를 가지고 있다. 아울러 클래스 객체는 새롭게 만들어진 클래스의 인스턴스 객체의 크기 정보를 바이트 크기로 가지고 있다.
클래스에 초기화 메소드를 만들어야 한다는 요구사항은 없다. 하지만 클래스에 따라서는 편의를 위해 여러개의 이니셜라이저를 제공하기도 한다. -많은 인수를 하나하나 모두 전달해야 하는 경우. -기본적인 값을 사용해서 간단하게 초기화하는 경우. -초기화를 위해 데이터를 메모리에서 읽어 들이는 경우. -파일에서 읽어들이는 경우. 등등... 여러 종류의 이니셜라이저 중에서도 인스턴스를 초기화하기 위해 반드시 실행되어야 하는 메소드를 지정된 이니셜라이저 (designated initializer) 라고 한다. #import #import @interface Point : Object { int x, y; } - (id) init; - (id) initWithPoint : (int) x int : (int) y; -..
새로운 객체를 만드는 방법은 [someClass new], [[someClass alloc] init] 같은 형식이 있다. 두 방법 모두 객체를 생성해 주는 것은 동일하지만 alloc과 init을 쓰는 것을 권장한다. 객체를 할당하고 초기화 했을때 비로소 객체의 초기화가 완성된다. Car *car = [Car alloc]; 은 에러없이 동작하겠지만 초기화를 하지 않았기 때문에 버그를 발생시킬 수 있다. 메모리 할당의 중요성에 상응하는 것이 초기화 객체를 할당하고 초기화 하는 방식. Car *car = [[Car alloc] init]; 이런식으로 alloc한 후 반환된 객체에 바로 연결해서 init 메소드를 보내는 방식은 매우 중요하다. 다음의 방식은 피하는게 좋다. Car *car = [Car allo..
사과 + [ : 코드 블록을 왼쪽으로 쉬프트한다. Tab : 코드를 완성한다. Esc : 코드 완성 메뉴를 보여준다. Control + / : 코드 완성에서 다음 입력 영역으로 이동한다. 사과 + Control + S : 스냅 샷을 만든다. Control + A : 커서를 라인의 시작으로 이동한다. Control + E : 커서를 라인의 끝으로 이동한다. Control + D : 커서에 인접한 문자를 지운다. 사과 + Shift + ↑ : 연결된 파일을 연다. 사과 + D : 북마크 추가한다. Option + 더블클릭 : 문서를 찾는다. 사과 + Option + Y : 디버거로 프로그램을 실행한다. 사과 + Shift + O : 다음 스텝으로 넘어간다. 사과 + Option + ? : 도움말 Doc 창 ..
단지 클래스를 가리키는 포인터가 아니라 이 클래스를 상속받고 있는 경우, 헤더 파일에 @class를 사용하는 것만으로는 모든 정보를 전달할 수 없다. 즉, 전방선언이 아니라 포함을 해야하는데, 이런 경우 #import 를 사용한다. 단, 코드를 보면 는 사용하고 있지 않은데, Engine.h가 이미 를 포함하고 있다는 것을 알고 있기 때문에 여기서는 포함할 필요가 없는 것이다. 하지만 포함시켜도 문제는 없다. #import는 똘똘하니까 ㅎ ex) #import "Engine.h" @interface Slant6 : Engine @end // Slant6
접근자 메소드란? 접근자 메소드(Accessor Method)는 객체의 특정한 속성을 읽거나 변경할 때 쓴다. 객체의 값을 설정하는 메소드를 세터(Setter). Ex) - (void) setMyValue:(id)obj; 객체의 상태를 변경하는 메소드를 뮤테이터(mutator). 객체의 속성에 접근하기 위한 객체를 사용하는 코드를 제공하는 메소드를 게터(getter) 게터 메소드는 단순히 자신들이 반환할 속성의 이름으로 쓰여진다. Ex) -(MyValue *) myValue;
@implementation Circle - (void) setFillColor: (ShapeColor) c { if (c == kRedColor){ c = kGreenColor; } [super setFillColor: c]; } // setFillColor // and the rest of the Circle @implementation // is unchanged @end // Circle ------------------------------------------ 빨간 원을 녹색 원으로 바꾸는 소스이다. setFillColor: 가 Shape에 정의되어 있는 경우, super를 사용해서 수퍼클래스(Shape)에게 fillColor의 인스턴스 변수에 변경된 색을 저장할 수 있도록 할 수 있다. (s..
@implementation Shape 에 구현해 놓은 메소드들을 보자. @implementation Shape - (void) setFillColor : (ShapeColor) c { fillColor = c; } - (void) setBounds : (ShapeRect) b { bounds = b; } - (void) draw { // draw 는 구현하지 않는다. } @end Shape 에서 draw 를 구현하지는 않지만 하위 클래스가 상속받아 구현하도록 항상 정의한다. 하위 클래스에서 -(void) draw 를 구현하면 된다.
@interface Circle : NSObject @interface 지시자 다음에는 클래스 이름이 따라온다. 콜론(:) 뒤에 오는 식별자가 상속받으려는 상위 클래스의 이름이다. Objective-C 는 다중 상속을 지원하지 않는다. @interface Circle : Shape @end // Circle @interface Rectangle : Shape @end // Rectangle * Circle과 Rectangle의 인터페이스를 Shape에서 상속
Circle fillColor bounds setFillColor: setBounds: draw Rectangle fillColor bounds setFillColor: setBounds: draw 이와 같이 중복되는 부분이 많으면 비효율 적이다. 중복되는 코드를 한곳에 합쳐서 정리 하는 방법 - 상속. Shape 클래스를 상속받아 Circle 과 Rectangle 를 정의 하면 이와 같다. Circle 클래스를 수퍼클래스( 부모클래스 )라 부른다. Circle 과 Rectange 클래스를 서브클래스 ( 자식클래스 ). Circle 과 Rectangle 은 Shape 로 부터 상속을 받았기 때문에 Shape의 인스턴스 변수 fillColor 와 bounds 를 받는다. 메소드 또한 상속.
* 메소드 선언 (method declarations) : 내가 지원하는 기능이라고 선언 - (void) draw; - (void) setFillColor: (ShapeColor) fillColor; - (void) setBounds: (ShapeRect) bounds; ----------------------------------------------- - (반환타입) 메소드 이름: (반환타입) 인수; - 기호는 메소드를 선언한다는 의미.