-- XCode 4.2 부터 ARC 가 추가되어 좋은건 써야 겠기에 http://iphone.galloway.me.uk/iphone-sdktutorials/singleton-classes/ 참고 .m 에서는 아래 코드와 같이(TWEngine 을 자기 클래스 이름으로 ㅇ_ㅇ.) .h 에서는 NSCopying 프로토콜 추가 해야 될듯(선언은 +(TWEngine*)sharedTWEngine 만) static TWEngine *sharedTWEngineManager = nil; +(TWEngine*)sharedTWEngine { @synchronized(self) { if (sharedTWEngineManager == nil) sharedTWEngineManager = [[self alloc] init]; } ..
View Hierarchy - Manipulation • Add/remove views in IB or using UIView methods - (void)addSubview:(UIView *)view; - (void)removeFromSuperview; • Manipulate the view hierarchy manually: - (void)insertSubview:(UIView *)view atIndex:(int)index; - (void)insertSubview:(UIView *)view belowSubview:(UIView *)view; - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)view; - (void)exchangeSubviewA..
UIApplicationDelegate • Xcode project templates have one set up by default • Object you provide that participates in application lifecycle • Can implement various methods which UIApplication will call • Examples: - (void)applicationDidFinishLaunching:(UIApplication *)application; - (void)applicationWillTerminate:(UIApplication *)application; 홈 버튼 눌렀을때(어플 종료전에 후다닥 처리해야 될 사항들) - (void)applicationW..
어떻게 알아 듣지도 못하는 영어로 강의하는 Stanford 자료(Itune U에 무료로 올라가 있음)가 공부하는데 도움이 더 되는듯 ㅠ_ㅠ + alloc ■ Class method that knows how much memory is needed (alloc 은 메모리 할당 과정) - init ■ Instance method to set initial values, perform other setup Obj-C에선 dealloc 을 직접 호출 하는 일이 없음(한가지 예외가 존재하긴 함.. 아래 코드) - (void)dealloc { // Do any cleanup that’s necessary // ... // when we’re done, call super to clean us up [super de..
----------------------------------------------------------------------------------------------------------------------------------------------------------------- error : No such file or directory iPhone 프로그래밍 할때 .m 과 .h 파일을 중복해서 만들기 귀찮을때 NSObject 의 subclass 로 Cocoa Class 로 생성 시킬때 접하게 되는 문제 #import 해당 문장을 아래와 같이.. #import ---------------------------------------------------------------------------..
델리게이트 띄우기 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; 델리게이트 메소드 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { //구현 }
프로토콜 적용 //액션시트 할당 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"My Title" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"OK" otherButtonTitles:@"Other1",@"Other2",nil]; //액션시트 띄우기 [actionSheet showInView:self.view]; //탭바 같은걸로 액션 시트 버튼이 안먹힐때 //[actionSheet showInView:[UIApplication sharedApplication].keyWindow]; //액션시트 해제 [actionSheet release]; -(void)act..
- (void)connectToServer { NSString *smsURL = @"http://www.google.co.kr"; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; NSString *post = [NSString stringWithFormat:@"password=%@&id=%@",@"password",@"id"]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d",[postData l..
서버를 구축했으니, 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..