아이폰 어플 개발할때 클래스 생성과 사용하는 방법


<순서>
Section 5. 클래스 생성
Section 6. 생성한 클래스 사용


이번 과제에서는 PolygonShape(다각형) 클래스를 생성한후 WhatATool의 메인 함수에서 클래스를 호출하는 함수를 불러본다.


아래와 같은 소스가 추가 될 것이다.


int main (int argc, const char * argv[]) {
    NSAutoreleasepool * pool = [[NSAutoreleasePool alloc] init];

    PrintPathInfo(); // Section 1
PrintProcessInfo(); // Section 2
PrintBookmarkInfo(); // Section 3
PrintIntrospectionInfo(); // Section 4
PrintPolygonInfo(); // Section 6 (section 5는 메인에 함수를 추가하지 않는다)
[pool release];
return 0;
}


Section 5. 클래스 생성

■ 새로운 PolygonShape 라는 클래스 만들기 (다각형 클래스)


Xcode에서
1.File > New File을 선택
2.Mac OS X아래 CoCoa 섹션의 'Objective-C class' 템플렛을 선택한다.
3.PolygonShape.m 으로 생성한다. - 헤더파일을 만들기 위한 체크박스를 체크하는 것을 잊지 말것.


* 새로운 클래스는 디폴트로 NSObject를 계승받는다.


자 이제 새로운 클래스에 속성을 부여해보자.
Objective-C 2.0은 오브젝트의 속성에 접근하는 새로운 메커니즘을 제공한다.
클래스는 "properties"를 정의 할 수 있으며, 이것이 유저가 클래스에 억세스 하는 방법을 제공한다.
properties는 개발자의 단순작업(getter/setter 코딩)을 없애주며 메모리 관리 폴리시와 속성의 사용법을 정의하도록 해준다.
예를 들면, property를 읽기 전용으로 지정하거나 오브젝트의 소유권등을 정의할 수 있다.


■ PolygonShape 클래스에 속성 지정하기


1. 아래의 속성을 지정한다.
• numberOfSides(면의 수) – 정수형
• minimumNumberOfSides(최소 면의 수) – 정수형
• maximumNumberOfSides(최소 면의 수) – 정수형
• angleInDegrees(내각) – 실수형, 읽기전용
• angleInRadians(호도) – 실수형, 읽기전용
• name(이름) – NSString 오브젝트, 읽기전용


2. numberOfSides, minimumNumberOfSides, maximumNumberOfSides의 세가지 속성은
적절한 타입의 인스턴스 변수로 저장될 수 있어야 한다. 이 속성들은 @synthesize 옵션을 이용하면 컴파일러가
자동으로 getter/setter를 생성하여주며, 읽기 전용 속성은 getter만이 생성된다.


3. setter 메소드에 아래와 같은 조건을 부여하라
• numberOfSides – 최소값과 최대값의 사이 값만 가질수 있다.
• minimumNumberOfSides – 2보다 커야 한다.
• maximumNumberOfSides – 12보다 작아야 한다.


maximumNumberOfSides에 5가 설정되어 있는데 numberOfSides에 9를 세팅하려고 한다면 아래와 같은 에러로그를 출력하라.
Invalid number of sides: 9 is greater than the maximum of 5 allowed


4. 아래와 같은 초기화 메소드를 생성하라.
- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max;


5. 슈퍼클래스인 NSObject의 init메소드를 오버라이드 하여 아래와 같은 디폴트값을 설정하는 커스텀 init을 생성하라.
numberOfSides – 5, minimumNumberOfSides – 3, maximumNumberOfSides – 10


6. angleInDegrees와 angleInRadians는 @synthesize 옵션을 사용하지 말라.
그리고 인스턴스 변수도 불필요하다. 이 두 속성은 numberOfSides의 값에 의해 결정될 것이다.
여기서는 정규 다각형(regular polygon)만 만들것임으로 각도(angles)의 값은 모두 똑같을 것이다.


7. name속성도 @synthesize 옵션을 사용할 필요가 없다. (인스턴스 변수도 필요없다.)
면의 갯수로부터 다각형의 이름을 출력하게 될 것이다.
<예>
면이 3일 경우: “Triangle”
면이 4일 경우: “Square”


8. PolygonShape 클래스의 -description 메소드를 아래 예와 같이 나오도록 구현하라.
Hello I am a 4-sided polygon (aka a Square) with angles of 90 degrees (1.570796 radians).


9. dealloc메소드를 사용하여 메모리 관리를 하고, dealloc이 불리워졌을때 로그를 출력하도록 하여라.


<힌트>


•다각형의 이름은 위키에서 찾을 수 있다.
•내각(angleInDegrees)을 구하기 위한 식은 다음과 같다. (180 * (numberOfSides - 2) / numberOfSides)
•삼각법(trigonometry): 360° 는 2π(파이) 이다.
•π(파이)의 값은 M_PI에 정의되어 있다.

Section 6. 생성한 클래스 사용

WhatATool.m 파일에 #import "PolygonShape.h" 를 삽입한다.


중요!!! 여기서는 PolygonShape를 생성하기 위해 +alloc과 -init을 사용하도록 한다. 생성된 오브젝트는 배열에 넣도록 하고
사용이 끝난 후엔 메모리 관리 기술을 이용하여 오브젝트를 릴리스 하도록 한다.


1. alloc/init를 사용하여 mutable array를 생성하라.


2. 아래 값을 사용하여 3개 또는 그 이상의 PolygonShape 오브젝트를 생성하라.

Min number of sides Max number of sides Number of sides
 3  7  4
 5  9  6
 9  12  12

3. 생성한 오브젝트를 배열에 추가하고 description을 이용하여 로그를 출력하라. 최소한 3줄의 로그가 찍여야 한다.

4. polygon 오브젝트의 제약을 테스트 해본다.
루프를 돌며 numberOfSides에 10을 세팅해보라. 위의 테이블을 이용해 만든 오브젝트라면 두줄의 로그가 찍힐것이다.

5. polygon 오브젝트가 메모리로부터 릴리스 되었는지 확인한다.
주어진 규칙대로 생성한 클래스라면 dealloc이 불리면서 3번의 로그가 찍힐 것이다.


<시도>

우선 name의 getter를 구현하기 위해 다각형의 이름을 찾아봤다.

Polygon names

Name Edges
digon 2
triangle (or trigon) 3
quadrilateral (or quadrangle or tetragon) 4
pentagon 5
hexagon 6
heptagon 7
octagon 8
enneagon (or nonagon) 9
decagon 10
hendecagon 11
dodecagon 12

<구현한 소스>

PolygonShape.h +-----+-----+-----+-----+-----+

//

//  PolygonShape.h

//  WhatATool

//

//  Created on 09. 12. 14.

//  Copyright 2009 __MyCompanyName__. All rights reserved.

//

#import

@interface PolygonShape : NSObject {

intnumberOfSides;

intminimumNumberOfSides;

intmaximumNumberOfSides;

}

@propertyintnumberOfSides;

@propertyintminimumNumberOfSides;

@propertyintmaximumNumberOfSides;

@property (readonly) float angleInDegrees;

@property (readonly) float angleInRadians;

@property (readonly) NSString *name;

//헤더에 이 메소드를 추가하는걸 까먹어서 에러가 났었다.

- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max;

@end

PolygonShape.m +-----+-----+-----+-----+-----+

//

//  PolygonShape.m

//  WhatATool

//

//  Created on 09. 12. 14.

//  Copyright 2009 __MyCompanyName__. All rights reserved.

//

#import "PolygonShape.h"

@implementation PolygonShape

@synthesize numberOfSides;

@synthesize minimumNumberOfSides;

@synthesize maximumNumberOfSides;

//synthesize선언한변수지만 setter존재하면 getter생성됨으로마음놓고써도된다.

-(void)setNumberOfSides:(int)newNumberOfSides {

    //numberOfSides최소값과최대값의사이값만가질수있다

    if(newNumberOfSides > maximumNumberOfSides) {

        //maximumNumberOfSides 5설정되어있는데 numberOfSides 9세팅하려고한다면에러로그를출력하라.

        NSLog(@"Invalid number of sides: %d is greater than the maximum of %d allowed", newNumberOfSides, maximumNumberOfSides);

    } elseif (newNumberOfSides < minimumNumberOfSides) {

        NSLog(@"Invalid number of sides: %d is less than the minimum of %d allowed", newNumberOfSides, minimumNumberOfSides);

    } else {

        numberOfSides = newNumberOfSides;

    }

}

//minimumNumberOfSides 2보다커야한다.

-(void)setMinimumNumberOfSides:(int)newMinimumNumberOfSides {

    if (newMinimumNumberOfSides < 2) {

    NSLog(@"Invalid minumum number of sides: %d is less than 2 allowed", newMinimumNumberOfSides);

} else {

    minimumNumberOfSides = newMinimumNumberOfSides;

}

}

//maximumNumberOfSides 12보다작아야한다.

-(void)setMaximumNumberOfSides:(int)newMaximumNumberOfSides {

    if (newMaximumNumberOfSides > 12) {

NSLog(@"Invalid maximum number of sides: %d is greater than 12 allowed", newMaximumNumberOfSides);

} else {

maximumNumberOfSides = newMaximumNumberOfSides;

}

}

//4. 초기화메소드를생성하라.

//주의! numberOfSides를 Max Min보다 먼저 세팅하려고 Max Min값이 0으로 인식되어 조건에서 튕겨나간다.

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max {

[selfsetMinimumNumberOfSides:min];

[selfsetMaximumNumberOfSides:max];

[selfsetNumberOfSides:sides];

returnself;

}

//5. 슈퍼클래스인 NSObject init메소드를오버라이드하여아래와같은디폴트값을설정하는커스텀 init생성하라.

-(id)init {

if (self = [superinit]) {

    self = [selfinitWithNumberOfSides:5minimumNumberOfSides:3maximumNumberOfSides:10];

}

returnself;

}

//내각

-(float)angleInDegrees {

return (180 * (self.numberOfSides - 2) / self.numberOfSides);

}

//라디안

-(float)angleInRadians {

returnM_PI / 180 * self.angleInDegrees;

}

//7. 면의갯수로부터다각형의이름을출력하게것이다.

-(NSString *)name {

    switch ([selfnumberOfSides]) {

case2: return@"digon"; break;

case3: return@"triangle"; break;

case4: return@"quadrilateral"; break;

case5: return@"pentagon"; break;

case6: return@"hexagon"; break;

case7: return@"heptagon"; break;

case8: return@"octagon"; break;

case9: return@"enneagon"; break;

case10: return@"decagon"; break;

case11: return@"hendecagon"; break;

case12: return@"dodecagon"; break;

default: return@"";

}

}

//8. description오버라이드

//: Hello I am a 4-sided polygon (aka a Square) with angles of 90 degrees (1.570796 radians).

-(NSString *)description {

return [NSStringstringWithFormat: @"Hello I am a %d-sided polygon (aka a %@) with angles of %.0f degrees (%.6f radians)."

self.numberOfSides, self.name, self.angleInDegrees, self.angleInRadians];

}

//9. dealloc메소드를사용하여메모리관리를하고, dealloc불리워졌을때로그를출력하도록하여라.

- (void)dealloc {

NSLog(@"dealloc called");

[superdealloc];

}

@end

WhatATool.m의 함수(Section 6) 부분 +-----+-----+-----+-----+-----+

//#import "PolygonShape.h" 를 잊지말자


//Section 6

void PrintPolygonInfo() {

    NSLog(@"----- Section 6 -----");


    //배열 생성

NSMutableArray *array = [[NSMutableArrayalloc] init];

PolygonShape *polygon1 = [[PolygonShapealloc] initWithNumberOfSides:4minimumNumberOfSides:3maximumNumberOfSides:7];

PolygonShape *polygon2 = [[PolygonShapealloc] initWithNumberOfSides:6minimumNumberOfSides:5maximumNumberOfSides:9];

PolygonShape *polygon3 = [[PolygonShapealloc] initWithNumberOfSides:12minimumNumberOfSides:9maximumNumberOfSides:12];

    //생성한 다각형 정보를 로그에 출력하고 배열에 다각형 오브젝트를 추가한다.

NSLog([polygon1 description]);

[array addObject:polygon1];

NSLog([polygon2 description]);

[array addObject:polygon2];

NSLog([polygon3 description]);

[array addObject:polygon3];

//제약을 테스트하기 위해 numberOfSides에 10을 넣어본다.

for (PolygonShape *polygon in array) {

polygon.numberOfSides = 10;

}

[polygon1 dealloc];

[polygon2 dealloc];

[polygon3 dealloc];

[array dealloc];

}

<결과>

2009-12-17 14:54:31.297 WhatATool[1125:10b] ----- Section 6 -----

2009-12-17 14:54:31.297 WhatATool[1125:10b] Hello I am a 4-sided polygon (aka a quadrilateral) with angles of 90 degrees (1.570796 radians).

2009-12-17 14:54:31.297 WhatATool[1125:10b] Hello I am a 6-sided polygon (aka a hexagon) with angles of 120 degrees (2.094395 radians).

2009-12-17 14:54:31.297 WhatATool[1125:10b] Hello I am a 12-sided polygon (aka a dodecagon) with angles of 150 degrees (2.617994 radians).

2009-12-17 14:54:31.298 WhatATool[1125:10b] Invalid number of sides: 10 is greater than the maximum of 7 allowed

2009-12-17 14:54:31.298 WhatATool[1125:10b] Invalid number of sides: 10 is greater than the maximum of 9 allowed

2009-12-17 14:54:31.298 WhatATool[1125:10b] dealloc called

2009-12-17 14:54:31.299 WhatATool[1125:10b] dealloc called

2009-12-17 14:54:31.299 WhatATool[1125:10b] dealloc called

The Debugger has exited with status 0.



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10076162791
Posted by 오늘마감

댓글을 달아 주세요

아이폰 어플 개발 , Selector 의 이용과 클래스 정보 보는 방법


지금까지 만들어봤던 NSString, NSURL, NSProcessInfo, NSDictionary 등과 NSMutableString을 인스턴스화해서
배열(NSMutableArray)에 넣어라.


그리고 아래를 수행하라.


1. 오브젝트의 클래스명을 출력하라
2. 오브젝트가 NSString 클래스인지 출력하라
3. 오브젝트가 NSString의 서브클래스인지 출력하라
4. 오브젝트가 "lowercaseString"를 지원하는지 출력하라
5. "lowercaseString"를 지원하는 오브젝트라면 performSelector:를 이용하여 결과를 출력하라


<예상하는 결과 형식>

2008-01-10 20:56:03 WhatATool[360] Class name: NSCFString
2008-01-10 20:56:03 WhatATool[360] Is Member of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Is Kind of NSString: YES
2008-01-10 20:56:03 WhatATool[360] Responds to lowercaseString: YES
2008-01-10 20:56:03 WhatATool[360] lowercaseString is: hello world!
2008-01-10 20:56:03 WhatATool[360] ======================================
2008-01-10 20:56:03 WhatATool[360] Class name: NSURL
2008-01-10 20:56:03 WhatATool[360] Is Member of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Is Kind of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Responds to lowercaseString: NO
2008-01-10 20:56:03 WhatATool[360] ======================================
2008-01-10 20:56:03 WhatATool[360] Class name: NSCFDictionary
2008-01-10 20:56:03 WhatATool[360] Is Member of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Is Kind of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Responds to lowercaseString: NO
2008-01-10 20:56:03 WhatATool[360] ======================================


<힌트>
아마도 NSString과 같은 클래스 명이 예상치 않은 결과가 나올수 있지만
그건 implementation의 문제이니 여기선 그냥 넘어가도록 한다.


<실습>
NSString, NSURL, NSProcessInfo, NSDictionary, NSMutableString을 만든다.


NSString *myString = @"Hello World!";
NSURL *myURL = [NSURL URLWithString:@"
http://www.stanford.edu"];
NSProcessInfo *myProcess = [NSProcessInfo processInfo];
NSDictionary *myDictionary = [NSDictionary dictionary];
NSMutableString *myMutableString = @"This is a mutable string object";


NSMutableArray를 만들고 위의 오브젝트들을 추가한다.


NSMutableArray *array = [NSMutableArray array];
[array addObject:myString];
[array addObject:myURL];
[array addObject:myProcess];
[array addObject:myDictionary];
[array addObject:myMutableString];


루프를 돌며 클래스 정보를 출력한다.


■ 오브젝트의 클래스명을 출력하라


모든 오브젝트는 NSObject를 계승하니까... NSObject reference를 찾아보자.

- (NSString *)description 이라고 하니까, 클래스 설명이 나와버린다.

구글 검색을 해보니까 className을 쓰면 된다고 한다.

[obj className];

왜 NSObject의 리퍼런스에 나와있지 않은지 모르겠지만 아마도 다른 연관이 있는듯. 일단 나오니까 스킵.


 오브젝트가 NSString 클래스인지 출력하라
- (BOOL)isMemberOfClass:(Class)aClass 이용


오브젝트가 NSString의 서브클래스인지 출력하라
- (BOOL)isKindOfClass:(Class)aClass 이용


오브젝트가 "lowercaseString"를 지원하는지 출력하라
- (BOOL)respondsToSelector:(SEL)aSelector 이용


"lowercaseString"를 지원하는 오브젝트라면 performSelector:를 이용하여 결과를 출력하라
- (id)performSelector:(SEL)aSelector 이용

Selector 란 컴파일된 오브젝트의 메소드를 가르키는 이름이라고 한다.

즉, performSelector: 같은 메소드에 Selector를 지정함으로써 실행할수 있다는 뜻이다.

<결과>

성공!!!



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075791909
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 8. 13. 14:26
IBOulet 없이 델리게이트 구현하는 간단한 방법

출처 : http://cafe.naver.com/mcbugi.cafe?iframe_url=/ArticleRead.nhn%3Fclubid=16914752%26page=21%26searchtype=1%26query=delegate%26searchdate=all%26articlemedia=0%26sortby=date%26articleid=7177%26referrerAllArticles=true

이번 강좌에서 델리게이트 이론을 이해하실수 있도록 도와드리기 위해 델리게이트 구현법을 설명하겠습니다

"IB 없이 하기, UITableView끝장보기 (1) 델리게이트 구현이론"편에서 (http://cafe.naver.com/mcbugi/6676)

이미 감 잡으신 분도 있겠지만

그래도 이해 못하신 분들을 위해 설명해 보겠습니다.

아마 많은 분들이 고민하셨을거라 봅니다.

바로 객체간 데이터 통신입니다

예를 들어 객체 A와 B가 있습니다

A가 B에 데이터를 보내거나 함수를 호출하는건

A가 B를 하위로 소유하고 참조함으로서 간단히 B에 접근이 가능합니다 

그리고 B가 A를 호출 하려면 B에 A의 주소가 입력되어 있고 A를 참조해야지만 접근이 가능합니다

결국 A가 B를 쓰려면 B를 참조하는걸로 가능하지만 B가 A를 호출하려면 B가 A를 참조해야 합니다

좀 헤깔리나요;;;

결론은 A와 B가 서로 통신하려면 서로 참조해야 한다는 겁니다.

하지만 만약

A가 만든 ViewController이고 B가 UITableView이라면 서로 참조하는 방식은 불가능합니다

UITableView는 제공되는 API라서 UITableView의 헤더를 수정한다는건 불가능하기 때문이죠.

그래서 사용된것이 델리게이트 프로토콜 방법입니다

약속된 함수만 호출 하도록 하는거죠

하지만 여태껏 API에서 정의된 델리게이트만 사용해보고

직접 그쪽에서 어떻게 호출하는지 알수가 없습니다

즉 있는걸 써보기만 했습니다

그래서 이번에는 직접 델리게이트를 구현해보겠습니다

한번 간단한 게임을 만들어 보겠습니다

뭐가좋을까요.....

아 폭탄 해체 게임을 해보도록 하겠습니다.

우선 Window-Based로 새 프로젝트는 만듭니다

프로젝트명은 Boom이라 하죠

간단한 어플이 될것이니 ViewController까지 만들것 없이 뷰만 가지고 만들어 보겠습니다

뷰를 하나 만들고 시간 카운트 폭탄이 될것이니 

빨간선, 파랑선 버튼 두개 만들고 시간을 표시할 라벨뷰 

이렇게 세개의 뷰를 만듭니다

어플의 시작 위치인 AppDelegate에서 만든 BoomView를 넣어줍니다

BoomView입니다 우선 아무것도 없습니다


 lblTime만 만든 이유는 이 컨트롤만 나중에 계속 접근할 필요가 있기 때문입니다 (시간 표시)

init함수에서 lblTime과 두 번튼을 만들겠습니다

그리고 각각의 버튼이 눌러졌을때 각각 Red와 Blue함수가 호출되도록 했습니다

BoomView를 더 구현하기 전에 먼저 폭탄을 만들어야 겠죠

Bomb클래스를 NSObject로 만듭니다

정말 아무것도 없습니다.

우선 클래스의 구조를 구현하겠습니다

객체가 만들어지면 타이머를 설정하고 시간다 되면 폭파 시키겠습니다

우선 헤더에 다음 코드를 넣습니다

NSTimer *myTimer;

int timeCount;

@property 설정은 필요없습니다 안에서만 다룰거라


그리고 클래스 구현 파일에서 다음 코드를 넣습니다

- (id)init {

self = [superinit];
if (self != nil) {
timeCount = 10;
myTimer = [NSTimerscheduledTimerWithTimeInterval:1.0target:selfselector:@selector(chkTime) userInfo:nilrepeats:YES];
}
returnself;

}

- (void)chkTime {

timeCount--;
if (timeCount == 0) {
[myTimer invalidate];
myTimer = nil;

//
}

}


우선 timeCount를 10주고 시작합니다

그리고 매초마다 chkTime이 실행 되도록 설정했습니다

매초 실행 할때마다 카운트가 줄고 0이 되면 타이머는 끄도록 했습니다


그러고보니 어떤 선이 맞는건지 정하는걸 깜빡했군요


헤더에 Bomb 클래스 선언 전에 다음코드를 넣습니다

enum {

    BombLineRed = 0,

    BombLineBlue = 1,

};

typedef NSUInteger BombLineColor; 


이것은 int값과 같은것이지만 알아보기 쉽도록 했습니다

그리고 클래스 변수로 선언합니다

BombLineColor RightLine;



그리고 선을 자를때 호출되는 함수도 필요합니다

- (void)CutColor:(BombLineColor)Color;




 그리고 Bomb.m에서

초기화 함수 (init)에 아래 코드를 넣습니다

srandom(time(NULL));

RightLine = random() % 2;


 

그리고 새로운 함수를 추가합니다

- (void)CutColor:(BombLineColor)Color {

if (Color == RightLine) {
else {
}

}


맞을경우와 틀릴경우입니다만


아직 델리게이트 구현을 안했으므로 나중에 수정하겠습니다




여기서 잠시 정리해 보겠습니다

Bomb객체가 만들어지면 (init)

남은시간은 10초가 되고 (timeCount)

어느 선을 잘라야 폭탄이 멈추는지 설정합니다 (RightLine)

그리고 타이머가 작동합니다 (myTimer)


시간이 다 지나면 터질것이고 잘못 잘라도 터질것입니다

선을 자를때는 - (void)CutColor:(BombLineColor)Color;를 호출합니다





이제 본격적으로 델리게이트 구현을 해보겠습니다

 먼저 헤더에서

@protocol BombDelegate; 선언을 합니다

그리고

클래스 변수로 

id delegate;

를 선언합니다


이건 외부에서도 접근해야 하니 당연히 property선언이 되어 있어야 합니다

@property (nonatomic,assignid delegate;





헤더의 맨 밑에 다음 코드를 추가 합니다

@protocol BombDelegate<NSObject>

@end

아까 위에서 추가한것은 미리 정의한것으로 보시면 됩니다


이제 델리게이트가 호출할 함수들을 정의하면 됩니다


여기서 필요한것은


폭탄이 멈추거나 터졌을때 호출되는 함수와


매초 줄때마다 호출되는 카운트 함수, 이 두개가 필요 하겠군요

- (void)BombTimeCount:(int)count;

먼저 타임 카운트 입니다 간단히 몇초 남았나 count에 인자로 돌려줍니다

- (void)BombResponse:(Bomb *)Object Response:(BombResponseType)Response;

폭탄이 터지거나 멈출경우 호출되는 함수로 위와 같이 만들었습니다

Object 인자로 이 폭탄 객체의 주소를 돌려줍니다

Response는 터졌거나 멈췄거나 둘중 하나 입니다만

BombResponseType또한 BombLineColor처럼 int타입으로  정의했습니다

헤더 상단에 아래 코드를 넣어 줍니다

enum {

BombStoped = 1,
BombBoom = 2,

};

typedef NSUInteger BombResponseType;

그냥 0, 1 식으로 해도 상관없으나 기왕이면 알아보기 쉽게 하겠습니다


델리게이트 구현할때 특징중 하나가


반드시 필요한 함수와 있어도 되는 함수를 정의 할수 있다는겁니다



현재 사용할 함수는 위의 두개 입니다


그러나 남은 시간을 안보고 그냥 선을 자를수도 있습니다



그래서 BombTimeCount함수는 옵션으로 설정합니다


그래서 코딩하면...



다음과 같이 됩니다

@required가 반드시 정의될 함수들이고

@optional이 필수는 아닌 함수들입니다

헤더 정의는 끝났으니  Bomb.m을 수정해 보겠습니다


아까 헤더에서 delegate가 @property로 설정되었으니

@synthesize delegate; 코드를 넣어줍니다

우선 chkTime함수부터 고쳐 보겠습니다

먼저 초가 하나 줄면

BombTimeCount를 호출해서 알려줍니다


그래서 다음 코드를  timeCount--;다음에 넣어줍니다

[self.delegateBombTimeCount:timeCount];


하지면 여기서 문제가 있습니다

아까한 약속은 BombTimeCount함수가 필수가 아닌 @optional이라는 겁니다

그래서 상대 객체에서 이 함수를 구현을 안했을수도 있습니다


@optional으로 정의 했다고 컴파일러에서 알아서 해주는것이 아니기 때문에


구현이 안되었을 경우를 상정해서 코드를 적어야 합니다

상대 객체에 구현되었는지 확인하는 코드는 다음과 같습니다

[self.delegaterespondsToSelector:@selector(BombTimeCount:)]

여기서 주의하실점은 인자입니다


예를 들어

함수가 

- (void)test; 라면 @selector(test)

- (void)test:(int)a; 라면 @selector(test:)

- (void)test:(int)a b:(int)b; 라면 @selector(test:b:)
- (void)test:(int)a b:(BOOL)b c:(NSString *)c d:(NSNumber *)d e:(UIImage *)e  라면 @selector(test:b:c:d:e:)


가됩니다


인자와 마춰주지 않으면 문제가 됩니다


그래서 맞는 코드는 다음과 같습니다

if ([self.delegaterespondsToSelector:@selector(BombTimeCount:)] ) {

[self.delegateBombTimeCount:timeCount];

}


이제 시간이 0초일때 폭탄이 터지니

다음 코드를 그if문 사이에 넣어줍니다

[self.delegateBombResponse:selfResponse:BombBoom];


BombResponse의 경우 @required로 정의 하였으니 별도로 구현을 확인할 필요가 없습니다.


시간 카운트 쪽은 끝났습니다


이번에는 선을 잘랐을때 입니다


기존의 코드를 다음과 같이 수정합니다

- (void)CutColor:(BombLineColor)Color {

[myTimerinvalidate];
myTimer = nil;
if (Color == RightLine) {
[self.delegateBombResponse:selfResponse:BombStoped];
else {
[self.delegateBombResponse:selfResponse:BombBoom];
}

}


선을 자를때 타이머를 꺼줍니다 (어차피 자르면 둘중하나이니,,,)



이제 Bomb 객체구현은 끝났습니다


이제 BoomView에서 사용해 보겠습니다


먼저 객체를 참조하고 델리게이트 약속을 합니다


BoomView.h에서

#import "Bomb.h"

정의해줍니다


그리고 BoomView헤더를 다음과 같이 수정해서 프로토콜 약속을 합니다

@interface BoomView : UIView {

클래스 변수로 

Bomb *bomb;선언을 합니다

이제 BoomView.m에서


init(초기화) 함수에서 폭탄을 할당하고 초기화 합니다

bomb = [[Bomb allocinit];
bomb.delegate = self; 


그리고 아까 만든 약속한 함수 두개를 구현해 줍니다

- (void)BombResponse:(Bomb *)Object Response:(BombResponseType)Response {

if (Response == BombBoom) {
UIAlertView *alert = [[UIAlertViewallocinitWithTitle:@"Boom!"message:nildelegate:nilcancelButtonTitle:@""otherButtonTitles:nil];
[alert show];
[alert release];
else {
UIAlertView *alert = [[UIAlertViewallocinitWithTitle:@"해제됨"message:nildelegate:nilcancelButtonTitle:@""otherButtonTitles:nil];
[alert show];
[alert release];
}

}

- (void)BombTimeCount:(int)count {

lblTime.text = [NSStringstringWithFormat:@"남은시간 : %i",count];

}

폭탄이 어떻게 되냐에 따라 뜨는 메세지가 다르도록 했습니다


이번에는 선 자르는 코드입니다


아까 구현한 두 함수가 Red와Blue였습니다 그걸 다음과 같이 수정해줍니다

- (void)Red {

[bombCutColor:BombLineRed];

}

- (void)Blue {

[bombCutColor:BombLineBlue];

}


완성된 코드


이상으로 델리게이트 구현법을 마치겠습니다

여기까지 읽어 주셔서 감사합니다 ^^



출처 : http://blog.naver.com/PostView.nhn?blogId=74hans&logNo=110226436
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 7. 2. 00:49
대박 아이폰 보조배터리 만드는 방법

http://www.parkoz.com/zboard/view.php?id=my_album&page=1&sn1=&divpage=17&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=77838&cstart_page=0

완전 대박



출처 : http://blog.naver.com/PostView.nhn?blogId=jkw1120&logNo=60104001911
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 7. 2. 00:48
아이폰에서 네스팟 등록하는 방법

오랜만에 쓰는 아이폰 관련 포스팅입니다.

이번에는 다른것이 아닌.... 매우 뒷북인 = _ = 네스팟 등록하기 입니다.

물론 본인도 아이폰을 사용하고 있지만 에그가 있었기때문에!!! 네스팟을 사용하지 않고 있다가

얼마전 에그를 분실했던 몇일간 학교에서 네스팟을 사용하며 그 진가를 알았기 때문에!! 요렇게 포스팅을 해 봅니다.

먼저 네스팟에 가입되셨는지를 확인하셔야하는데요!(보통 아이폰 개통시 같이 가입되지만 가끔 대리점의 실수로 개통이 안될수 있으니 체크필수!!)

(보통 114-고객센터에 문의하면 알려줄겁니다.)

** 보통 아이폰 가입시 네스팟 ID는 kt11111111(010을 제외한 본인의 휴대전화 번호)입니다.

네스팟에 가입된걸 확인하셨다면 먼저 홈페이지에 들어갑니다.

네스팟 홈페이지 - (http://internet.qook.co.kr/nespot_main/nespot_main.php)

자 이렇게 홈페이지에 들어가시면 왼쪽 상단에 MAC ID 등록이라는 부분이 있습니다. 그곳에 Go 라고 쓰여있는 버튼을 눌러줍니다.

팝업이 뜨며 ID와 비밀번호는 눌러달라고 하네요. ID : kt0000000 을 눌러주시고 비밀번호(디폴트 가입자의 주민번호 뒷자리) 를 입력해 줍니다

그러면 창이 바뀌면서 MAC ID 입력창이 뜨게 됩니다.

     

요런 화면이 뜨는데요. 전 이미 등록중이라 왼쪽처럼 표시가 되고 처음이시면 오른쪽처럼 입력을 요구하는 창이 뜰겁니다.

MAC ID 란 아이폰상의 WiFi 번호를 말하는데요 이를 확인하려면!!

설정 -> 일반 -> 정보로 들어가시면 WIFI 주소라고 쓰여져 있는 부분이 있습니다.

    

(파란색 네모안에 들어있는 12자리의 문자 입력)

MAC ID의 앞 6자리는 이미 리스트로 등록이 되어있어서 올바른 MAC ID로 등록을 하면 되고 뒤의 6자리만  " : " 표시 없이 입력해 주시면 됩니다.

이렇게 모두 입력을 하시고 확인을 누르시면 등록되었습니다!라는 팝업이 뜨고

이제 네스팟을 이용할수 있는 네스팟존(요즘은 쿡앤쇼존이라고 하더군요)에 가면 별도의 로그인 없이 네스팟을 이용할수 있습니다!!

집의 공유기에서 사용하는 Wi-Fi보다 빠르진 않지만 3G보다는 빠른 속도이며 무엇보다 데이터 과금이 되지 않는다는 부분이 가장 마음에 들더군요

의외로 네스팟이 잡히는곳이 많던데 (거의 모든 대학교) 어느정도나 되는지는 확인을 해 봐야겠네요

여튼 데이터 통화료를 아끼는데 조금의 일조를 하는 네스팟!! 의외로 등록만 해두면 따로 ID 입력이 필요 없으니 필수로! 해두면 좋을것 같습니다.

 


출처 : http://blog.naver.com/PostView.nhn?blogId=jkw1120&logNo=60105831159
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 7. 1. 18:07
아이폰 캘린더의 시작요일을 일요일로 바꾸는 방법

먼저 이런 말도 안되는 경우를!!! 과연 여러분들 겪을것인가 궁금하지만

일단 저한테 이런 현상이 있었으니 참고하시기 바랍니다. -_-;;

아이폰 기본 캘린더 어플입니다. 실행후 월보기로 보면 일요일이 맨 오른쪽에 있는게 보이죠?

월화수목금토 이렇게 보입니다. 보통 월화수목금토 이렇게 보여야 정상은 아니지만 우리는 이게 더 보기 편하자나요.

맨처음에 이거 보고 이거 ’o미 이런 표정이었습니다.

해결방법은 간단하더군요. ;;

설정 → 일반 → 다국어 → 언어 → English → Setting Language 라고 나오고 리스프링됩니다

모든 메뉴가 영어로 변경되었으니까

Settings → General → International → Region Format → South Korea 변경  → Language 다시 한글로 바꿔주면 됩니다.

그럼 다시 이렇게 정상으로 돌아옵니다. OTL...

왜 맨처음 사진 같이 나오는지 이유도 모르겠습니다.

모 어쨌든 이런 경우 당하신 분들은 요긴하게 적용하시길!!



출처 : http://blog.naver.com/PostView.nhn?blogId=jkw1120&logNo=60106881258
Posted by 오늘마감

댓글을 달아 주세요

  1. SKLEE

    감사해요. ㅜㅜ 저도 이래서 왜 이러나 고쳐보려고 햇는데 못 고치고 있엇는데 ^^ 감사합니다 ^^

    2010.09.07 10:16 [ ADDR : EDIT/ DEL : REPLY ]
  2. 1231412

    원래 일요일 월욜일 화요일 순이 정상맞는대요 ..정상은 아니지만 편한개아니라 정상입니다. 월부터시작해서 일로끝나는게이상한거죠 일요일이 원래는 첫주의 시작의 날이라

    2010.10.23 07:49 [ ADDR : EDIT/ DEL : REPLY ]

아이폰기본사용2010. 6. 29. 10:50
PC Suite 설치 후 최초 실행 시 PandaDamon 설치 방법
PC Suite를 처음 설치할 경우 프로그램 실행을 시키면 PandaDaemon이라는 프로그램이 설치가 됩니다.

이 프로그램은 아이폰과 PC Suite이 통신하기 위한 중요한 도구로서 어플 설치, 문자 발송, 파일 및 폴더의 권한 설정,
로그오프, 재부팅, 전원 끄기 등의 기능이 정상적으로 수행되도록 해 주는 겁니다.

아래 방법을 참조하세요. (영문 프로그램 설치하면 영어로 나옵니다만 간혹 아래처럼 중국어로 나오기도 합니다)

참고로 한글화 적용한 스샷과 함께 비교해서 올립니다.

1) PC Suite 설치를 완료하고 최초 실행 시 아래 같은 팝업창이 나오면 “安装守护程序(PandaDaemon 설치)” 버튼을
   클릭합니다.


2) 다음으로 아래의 메시지가 나오면 아이폰을 재부팅해 줍니다.




3) 아이폰이 재부팅된 후 “我已经关机并再次连接好了(재부팅 후 다시 연결하였음)옵션을 체크하고

   “执行检查(검사 실행)” 버튼을 클릭합니다.



4) 아래 그림처럼 PandaDaemon이 설치된 후 자동으로 PC Suite가 실행됩니다.



만일 실수로 설치를 하지 않았을 경우에는 System 탭에 Reinstall PandaDaemon 항목을 통해 설치를 할 수 있습니다.


 


출처 : http://blog.naver.com/PostView.nhn?blogId=jkw1120&logNo=60097420529
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 6. 29. 10:49
아이폰을 복원하는 간단한 방법

순정 상태에서 아이폰에 문제가 생기거나 혹은 탈옥/언락 후 필요에 의해서 복원 작업을 통해 초기 상태로 복구시킬 수가
있습니다. 아래 절차를 참조하세요. (만일 탈옥/언락한 후 벽돌 상태가 되었을 경우에는 강제 복원을 실행함)

1) 우선 여기를 참조하여 현재 본인의 아이폰에 해당하는 펌웨어를 컴으로 다운받아 복사해 놓는다.
   (이미 컴에 저장된 경우는 이 과정을 생략한다.)

2) 아이폰을 컴에 연결시킨 후 아이튠스를 실행시킨다.

3) 아래 그림처럼 Shift(맥의 경우 Option) 키를 누른 채 복원 버튼을 클릭한하다.
   (바로 복원 버튼만 클릭하면 자동으로 펌웨어를 검색하지만 위 방법이 훨씬 빠르다)



4) 아래의 팝업창에서 펌웨어 파일을 선택한 후 Open 버튼을 누른다. 



5) 복원하기 전에 백업할지 묻는 메시지가 나타나면 백업 옵션을 선택해도 되고 이미 백업한 경우에는 백업 안 함을 선택한다.



6) 아래 메시지가 나타나면 복원을 선택한다.



7) 복원 절차가 완료되면 아이폰이 재부팅되고 시작 중에 Apple 로고가 표시된다.



8) 복원 후에 "아이튠스에 연결" 화면이 나타나서 액티베이션(잠금 해제) 절차를 진행한다. "아이튠스에 연결" 화면이 사라지거나
   "iPhone이 네트워크 연결됨"이 나타날 때까지 계속 연결해 둔다. 아이튠스가 인터넷에 연결되어 있지 않으면 이 단계를
    완료할 수 없다.

 

9) 잠금해제 축하 메시지가 나온 후 아래 그림처럼 "다음 백업에서 복원" 옵션을 선택해 주면 기존의 데이터를 자동으로
    복구해 준다.

 


출처 : http://blog.naver.com/PostView.nhn?blogId=jkw1120&logNo=60096614137
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:21
iPhone Tutorial - nib 에서 불러온 뷰를 특정위치에 모달로 띄우는 방법
- (void)showmodal:(UIView*)pParentView {

    UIView* modalView = [self view];
    
    CGPoint middleCenter = modalView.center;
    CGSize offSize = [UIScreen mainScreen].bounds.size;
    CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, -300);
    
    modalView.center = offScreenCenter; // we start off-screen
    [pParentView addSubview:modalView];
    
    // Show it with a transition effect
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.9]; // animation duration in seconds
    modalView.center = middleCenter;
    [UIView commitAnimations];
}

- (IBAction)hideModal
{    
    CGSize offSize = [UIScreen mainScreen].bounds.size;
    CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, -300);
    [UIView beginAnimations:nil context:[self view]];
    [UIView setAnimationDuration:0.9];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)];
    [self view].center = offScreenCenter;
    [UIView commitAnimations];
}
                                          
- (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{    
    UIView* modalView = (UIView *)context;
    [modalView release];



출처 : http://blog.naver.com/PostView.nhn?blogId=suny4rang&logNo=50084523871
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 6. 24. 14:17
MobileTerminal 을 통한 슈퍼몽키볼 권한설정 방법

권한설정은 winscp로 하는 것이 가장 편하나, winscp가 되지 않는 유저분들을 위한 팁입니다

*준비물 - 2.0해킹된 아이팟 (안정화 과정을 통한 stash 폴더가 있어야 합니다), 무선인터넷, 어디서 구한 원숭이공 어플, 터치익스플로러

1.어플리케이션 복사

/private/var/stash/Applications.XXXXXX/ 폴더에 어플 폴더를 넣어줍니다

(XXXXXX의 부분은 사용자마다 다릅니다)

그런 다음 /private/var/mobile/ 폴더에 Documents 폴더를 생성해 주셔야 합니다

없는 폴더이기 때문에 직접 만들어주셔야 하며 터치익스플로러에서 마우스 우클릭을 통해 새 폴더를 만들 수 있습니다.

새 폴더의 이름은 F2 버튼을 통해 수정할 수 있습니다.

2.모바일 터미널 설치

Cydia에서 MobileTerminal을 설치해 줍니다.

저는 이미 설치했기때문에 오른쪽 위에 Modify라고 나오나

설치되있지 않은경우 Install이라고 나옵니다. 인스톨합니다!

3. 권한설정

모바일 터미널이 인스톨 되었으면 실행시켜 줍니다.

맨 처음 실행하면 iPod:~ mobile$ 이라고만 화면에 떠있는데

login 을 입력해 줍니다

login 을 입력한 후에 login: 이라고 뜨면 root 를 입력시켜 줍니다

root 를 입력하면 화면과같이 Password: 라고 뜨게 되는데 패스워드는 alpine 이며 화면에는 보이지 않기 때문에 잘 입력하셔야합니다!

위 화면은 정상적으로 로그인이 된 것입니다

iPod: ~ root# 라고 나와야 합니다!

그런다음 옆에다가

chmod -R 755 /private/var/stash/Applications.XXXXXX/Monkey\ Ball.app/

를 입력해 줍니다. XXXXXX는 사용자마다 다르기 때문에 제대로 확인하신후 입력해주시면 됩니다.

Monkey와 Ball 사이에는 반드시 \가 들어가야 하며, \ 뒤에는 띄어쓰기가 있습니다.

\는 터치내 키보드에서 123 버튼을 누른후 바로 위에 #+= 버튼을 눌러주시면 있습니다

슬래쉬의 반대방향입니다.

알파벳, 대소문자가 틀리지 않았는지 확인한 후 제대로 입력이 되셨으면 return 버튼을 눌러줍니다

만약 제대로 권한설정이 ‰榮摸



출처 : http://blog.naver.com/PostView.nhn?blogId=j021004&logNo=50035972335
Posted by 오늘마감

댓글을 달아 주세요