u 카테고리와 확장

n  의미

기본은 수직상속만 가능, 메소드를 추가해야할 경우 수직상속

카테고리를 사용함으로서 메소드의 수평적 상속이 가능

소스를 가지고 있는 않은 클래스에도 추가할 수 있음

카테고리를 사용해서 클래스의 implementation을 여러 파일로 쪼갤 수 있음

선언과 구현이 분리되어 있고, 클래스에 종속되어 있지 않음

 

n  Adding Methods to Classes

카테고리가 클래스에 추가한 method들은 클래스의 subclass 의해 상속

#import "ClassName.h"
 
@interface ClassName ( CategoryName )
// method declarations

@end

             -특징

               파일명이 ClassName+CategoryName.m으로 됨

#import "ClassName+CategoryName.h"
 
@implementation ClassName ( CategoryName )
// method definitions

@end

               오직 method 추가할 있음

               클래스 scope 모든 instance variables(@private조차도) 카테고리의 scope이므로

모두 접근이 가능

무한정 작성 가능

 

n  How you Use Categories

다른 implementation 의해 정의된 클래스들을 확장할

Cocoa frameworks 정의된 클래스들에 method들을 추가할

             subclass 대안으로 쓰려고

             클래스의 implementation 개의 소스 화일로 분배하려

             informal protocol 선언하기 위해

 

n  Categories of the Root Class

super 대한 message 가능

class object 루트 클래스에 정의된 instance method 수행할 있다

             보통 class object class method 수행하지만 루트 클래스에 정의된 instance method

특별한 경우이다.

카테고리로 추가한 instance method가 루트 클래스에서 수행되므로 예측이 불가능하게 되어 루트

클래스에 카테고리 사용은 바람직하지 못하다.

Posted by 김반장78
,

u 프로퍼티

n         프로퍼티 선언

Property 사용하기 위해서 일반적으로 @property 지시자와 @synthesize 지시자를 함께 사용

@property 지시자는 클래스의 @interface 내부에 선언하며 다음과 같은 형식으로 선언

@interface MyClass : NSObject
{
    float value;
}
@property float value;

@end

 

@property float value

위의 선언은 다음과 같이 두가지 메서드를 선언한것과 같은 기능

- (float)value;

- (void)setValue:(float)newValue;

 

n         @synthesize

구현부안에 getter, setter를 지정안했을경우@synthesize를 통해 컴파일러에게 작성을 지시함

- 주의

  @synthesize를 사용안할 경우 직접 구현부에 getter, setter를 작성해야 컴파일 가능하나

  문제가 발생할 여지가 있으므로@synthesize사용을 권장

 

n         @property 지시자의 attributes

- getter=gettername

기본적으로 Property getter 메서드 명은 Property 자신의 이름과 동일 ( : Property foo일 경우 foo) 하지만 이 기본 설정을 내가 원하는 메서드명으로 변경 할 수 있습니다.

- setter=settername

Property setter 메서드 명은 setPropertyName: 입니다. ( : Property foo일 경우 setFoo:)

역시나 이 기본 설정을 내가 원하는 메서드명으로 변경 할 수 있습니다.

- readwrite (DEFAULT)

Property의 값을 읽고 쓸 수 있다는 것입니다. 이 설정은 기본 설정입니다.

- readonly

Property의 값을 단지 읽기만 할수 있다고 정의하는 속성입니다.

이 속성은 @implementation 블럭 안에서 오로지  getter 메서드만 필요할 경우에 사용합니다.

@synthesize 지시자를 사용하였을 경우에는 역시나 getter 메서드의 역할만을 하게 됩니다.

값을 대입 하려고 할 경우 에러를 출력하게 됩니다.

- assign (DEFAULT)

단순하게 값을 대입합니다. 기본설정입니다.

이전에 어떤 객체를 가리키고 있던 Property라면 이로 인해 해당 객체는 미아가 되어 메모리릭의 주범이 될 수 있습니다.

가비지콜렉터를 사용하지 않는다면 사용을 피해야 합니다.

- retain

이 것은 assign과 비슷하지만 조금 다릅니다.

이전에 가리키고 있던 객체가 있다면 해당 객체를 Release하여 메모리에서 제거 합니다.

- copy

객체를 바로 대입하지 않고 해당 객체의 복사 메서드를 Invoke호출합니다.

그리하여 다른 메모리 영역에 복사본을 만든 다음 그것을 반환하게 됩니다.

이전에 가리키고 있던 값은 Release 시킵니다.

- nonatomic

이 속성은 접근자 메서드가 Atomic 하지 않게 동작하게 합니다.

기본적으로 접근자는 Atomic하게 동작합니다.

Atomic 이라는 말은 멀티스레드 등으로 구성된 프로그램이 특정 접근자 메서드를 호출할때 서로 충돌이 나지 않도록 객체 레벨에서 Lock을 걸고 Property에 접근하게 됩니다.

이런 접근이 필요없다면 이 속성을 사용하여 Non-Atomic하게 동작하도록 만들어 주시는 것이 좋습니다.

- dealloc

객체가 제거 될때 소멸자로 dealloc 호출되는데 Property들이 자동으로 소거되지 않아

명시적으로 제거해 주셔야 합니다.

- (void)dealloc {
    [property release];
    [super dealloc];

}

 

n         재선언

서브클래스에서 슈퍼클래스의 프로퍼티의 재선언 가능

속성 선언을 다시 해줘야함

 

n         Markup and Deprecation

@property CGFloat x

AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;

@property CGFloat y __attribute__((...));

 

 

 

 

Posted by 김반장78
,

u 프로토콜

n         정의

Protocols는 클래스 정의와 관련 없는 mothod선언 목록.

Protocols는 정의되어 있지 않은 객체에 메시지를 전달하고자 할 때 사용 가능

 

n         사용 범위

- 다른 사람들이 구현해야 할 mothod를 선언할 때

- 클래스는 숨긴 상태에서 object interface을 선어할 때

- 계층적으로 관련없는 클래스 간에 유사성을 가지게 할 때

 

n         Declaring Interfaces for Others to Implement

프로토콜로 선언된 메소드를 사용하려면, 프로토콜을 adopt(클래스가 프로토콜의 모든 메소드를 구현한다는 의미)하고, 그 메소드들을 구현.

- (void)mouseDown:(NSEvent *)theEvent;

- (void)mouseDragged:(NSEvent *)theEvent;

- (void)mouseUp:(NSEvent *)theEvent;

 

n         Methods for Others to Implement

- setAssistant:anObject

{

    assistant = anObject;

}

 

n         Declaring Interfaces for Anonymous Objects

id formatter = [receiver formattingService];

 

n         Non-Hierarchical Similarities

- (NSXMLElement *)XMLRepresentation;

- initFromXMLRepresentation:(NSXMLElement *)xmlString;

 

n         Formal Protocols (선언 방법)

@protocol 지시자를 사용

@protocol ProtocolName

method declarations

@end

 

n         XML을 이용한 protocol 표현이 가능

@protocol MyXMLSupport

- initFromXMLRepresentation:(NSXMLElement *)XMLElement;

- (NSXMLElement *)XMLRepresentation;

@end

 

n         주의점

- protocol은 클래스랑 연관지어 쓰는 것으로 단독으로 사용되지 않는다.

  따라서, protocol 이름은 자체의 namespace안에만 있게 되어 global하게 접근할 수 없다.

- protocol을 사용하려면 class가 그 protocol adopt해야 한다.

- protocol adopt할 클래스에서는 protocol이 선언된 헤더파일을 import 해야 한다.

 

n         Informal Protocols(Category 선언 내에 method를 선언한 것)

@interface NSObject ( MyXMLSupport )

- initFromXMLRepresentation:(NSXMLElement *)XMLElement;

- (NSXMLElement *)XMLRepresentation;

@end

              특징

              - informal protocol category와 선언방식은 똑같다.

차이점은 Catogory는 구현을 따로 카테고리로 만들어서 해야 하는 반면,

informal protocol은 구현을 클래스의method로 해 준다

 

n         Protocol Objects

런타임시 클래스는 class object method selector formal protocol protocol class

protocol object @protocol(protocol_name)지시자로 참조할 수 있다.

Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);

 

n         Adoption a Protocol(adopt는 클래스가 protocol의 모든 mothod를 구현한다는 의미)

@interface ClassName : ItsSuperclass < protocol list >

@interface ClassName ( CategoryName ) < protocol list >

@interface Formatter : NSObject < Formatting, Prettifying >

 

n         Conforming to a Protocol

-클래스가 protocol adopt하고 있는지 알아보기 위해 conformsToProtocol:메시지를 object에 보낸다.

-respondsToSelector:는 한 method이 구현되어 있는지를 알려준다.

-isKindOfClass:는 클래스가 상속 계층구조안에 속하는지 여부를 알려준다.

if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)]  ) {

    // Object does not conform to MyXMLSupport protocol

    // If you are expecting receiver to implement methods declared in the

    //  MyXMLSupport protocol, this is probably an error

}

 

n         Type Checking

protocol 타입선언 방법은 “type_name <protocol_name> 변수형태이다.

- (id <Formatting>)formattingService;

id <MyXMLSupport> anObject;

 

Formatter *anObject;

id <Formatting> anObject;
Formatter <Formatting> *anObject;

 

n         Protocols Within Protocols

@protocol ProtocolName < protocol list >

@protocol Paging < Formatting >

id <Paging> someObject;

 

if ( [anotherObject conformsToProtocol:@protocol(Paging)] )

 

n         상호참조 문제 해결

// A 선언

#import "B.h"

 

@protocol A

- foo:(id <B>)anObject;

@end

 

// B 선언

#import "A.h"

 

@protocol B

- bar:(id <A>)anObject;

@end

 

// A, B protocol이 상호 참조

@protocol B;

 

@protocol A

- foo:(id <B>)anObject;

@end

 

 

 


Posted by 김반장78
,

u 오브젝트의 메모리 할당과 초기화

n         객체생성시 요구사항

동적으로 새로운 객체를 메모리에 할당

새롭게 메모리에 할당된 객체에 적절한 값들로 초기화

작성예

id anObject = [SomeClass alloc];

[anObject init];

[anObject someOtherMessage];

간략화

id anObject = [[SomeClass alloc] init];

[anObject someOtherMessage];

반환값 체크

id anObject = [[SomeClass alloc] init];

if ( anObject )

[anObject someOtherMessage];

else

...

 

n         NSObject alloc, allocWithZone

NSObject는 모든 클래스가 상속받게되는 최상위 클래스 (자바의 Object클래스)

생성한 클래스와 클래스내의 인스턴스 변수들을 위한 메모리 공간 확보

확보한 메모리공간을 생성한 인스턴스변수가 가르키도록 지시(Pointer)

모든 인스턴스 변수들의 값을 0으로 세팅

 

n         초기화 메소드 구현

초기화 인스턴스 메소드의 명칭은 init로 시작

인자가 없는 초기화 메소드는 init:

인자가 있는 초기화 메소드는 initMethodName:

 

n         초기화 메소드 작성예

- 인자가 없는 경우

- (id)init {

self = [super init];

if (self) {

creationDate = [[NSDate alloc] init];

}

return self;

}

 

 

- 인자가 있는 경우

 

- (id)initWithImage:(NSImage *)anImage {

NSSize size = anImage.size;

NSRect frame = NSMakeRect(0.0, 0.0, size.width, size.height);

self = [super initWithFrame:frame];

If (self) {

image = [anImage retain];

}

return self;

}

 

n         메모리확보와 초기화의 결합

convenience constructors를 사용함으로서 메모리 자동해제(autorelease)를 적용

자동해제의 경우 직접해제를 할경우 크래시 발생

Posted by 김반장78
,

 

u 클래스 정의

n         Interface : 한 클래스의 메소드와 인스턴스 변수를 선언하고, 어느 수퍼클래스로부터 상속을 받는지를 기입

헤더 파일인 *.h 파일에 정의

 

n         Implementation : 실지로 클래스를 정의하는 부분

구현 파일인 *.m에 구현

 

n         해더 파일과 구현부를 나누는 이유

외부에서 볼때 구현부를 독립해 접근 불가능

 

n         작성 요령

가능하면 1:1로 작성 이름을 통일

 

n         인터페이스 작성 예

@interface ClassName : ItsSuperClass

{

instance variables declaration..

}

method declarations

@end

 

n         메소드 선언시 옵션

-

Instance method

+

Class method

              메소드 선언시 인스턴스와 클래스메소드 같은 이름으로 생성 가능

              메소드 이름과 인스턴스 변수도 같은 이름으로 생성 가능

 

n         메소드 선언 예

-선언

- (void) setWidth: (float) width height: (float) height;

-사용

id *myRect = [[Rectangle alloc] init];

[myRect setWidth:12.2 height:18.0];

-가변적 변수수를 가진 메소드 선언

- makeGroup:group, …;

 

n         interface import

interface import C #include와 동일하나, import가 똑 같은 것을 한번만 가져오는 것만 inclue와 다름.

 

n         implementation 작성예

@implementation ClassName : ItsSuperclass -> superclass 생략 가능

{

    instance variable declarations -> 생략 가능

}

method definitions

@end

              간단히 쓰면,

#import "ClassName.h"

 @implementation ClassName

method definitions

@end

 

n         다른 클래스 참조

인터페이스에 선언되지 않은 클래스를 사용할 때

상호참조의 문제를 해결하기 위해 @class 지시자를 사용.

@class Rectangle, Circle;

이것은 단지 컴파일러에 이것이 클래스 이름이라는 것만 알려주는 역할

 

n         인터페이스 특징

인터페이스파일은 클래스의 참조현황을 파악하기 쉽게함

인스턴스 개체를 따로 관리함으로서 보다 직관적인 OOP를 가능하게 함

 

n         instance변수들의 사용범위를 설명한 지시자

@private

instance변수의 범위를 그것이 선언된 class 한정한다.(상속불가)

@protected

instance변수의 범위를 선언되고, 상속된 class 한정한다. (상속가능)

@public

instance변수의 범위에 대한 제한을 없앤다. (상속가능)

 

n         instance변수 범위 지정의 이유

슈퍼클래스 변수와의 독립성을 유지함으로서 보다 완벽한 오브젝트화 가능

 

n         다른 객체에 속한 인스턴스 변수사용 예

선언구현부

@interface Sibling : NSObject

{

Sibling *twin;

int gender;

struct features *appearance;

}

참조구현부

- makeIdentification

{

if( !twin)

{

twin = [[Sibling alloc] init];

twin->gender = gender;

twin->appearance = appearance;

}

return twin;

}

 

 

영문 레퍼런스트를 정리하다가 갑자기 생겨난 쓸데없는 오기..ㅡ.ㅡ
도움 되려나~ 


Posted by 김반장78
,

요즘 이거 읽느라 프로젝트가 전혀 진행이 안된다..ㅡ.ㅡ
문서원본은 애플꺼고 번역자 정보도 안에 들어있으니 저작권은 문제없지 싶다.
프로그램용어에 울렁증 있어서 한글인데도 읽다보면 정신이 혼미해진다..
Posted by 김반장78
,

編集部注:このゲスト寄稿の著者Alex Ahlundは、AppVeeAndroidAppsの元CEOであり、後者は最近モバイルアプリ・ディレクトリーのAppolicious買収された。同氏は現在Appoliciousのアドバイザーを務めている。

デベロッパーからも業界外からもよく聞かれる質問がある:アプリを開発するとどのくらい儲かるのか? 答えに窮する質問である。

そこでわれわれは調査を行った。99セントから$79.99セントまでのアプリケーションを販売するデベロッパー124社に、販売データを尋ねた。この調査で対象としたのは、大成功しているアプリからやっと3桁に乗るものまで、さまざまな人気度のアプリである。デベロッパーには、出資を受け自社で複数タイトルを出している企業から、新参の一人で開発している作者までいる。一般アプリのデベロッパーもゲームデベロッパーも含まれている。このデータマイニングは、iPhoneアプリ業界全体をカバーし、飛び抜けた例外によってデータが偏ることがないことを目的としている。

さまざまな条件を考慮に入れる必要がある。製品Xがよく売れたからといって製品Yもそうなるとは限らない。長年アプリのレビューを行ってきたパブリッシャーとして、私は統計の冷酷な実データを紹介することにいつも少し懸念をもっている。将来のiPhoneアプリの正確なモノサシとしては、統計データは大きな誤解の元である。このため、読者のみなさんには業界を概要する目的でこの情報を解釈していただきたい。他の業界と同じく、そこには勝ち組もいれば負け組もその中間もいる。

以下の財務情報は、詳細な販売データと価格形態を提供してくれた96社のデベロッパーのものだ。

平均売上本数は10万1024本で、平均販売期間は261日間。1日平均売上数は387。平均価格は$5.49、ただしこの値は$49.99という外れ値によって歪められている。平均アップデート発行数は3.89で、平均開発コストは$6453。何社かは開発コストを記入しておらず、多くは数値に人件費を含めていない。外注する場合にはこの数字の5倍から10倍と考える方が安全だろう。しかし、平均で見る限り、iPhoneデベロッパーはわずかな初期開発コストによって15倍以上の利益を得ていることになる。

市場での成功は未だに頭でっかち

しかしながら、成功したアプリの上位10%をデータから取り除くと、数値はずっと小さくなり、多くのデベロッパーにとってのiPhone業界をはるかによく表すようになる。このシナリオでは、平均販売数は1万1625本、平均44本/日である。約23%のアプリが公開以来1000本以下しか売れていない(App Store掲載期間12~370日間)。また、56%のアプリが1万本以下、90%が10万本以下で、残りの10%が売上12万7000~300万本を達成している。

業界の見識ではアプリケーションのアップデートは必ずダウンロードと販売数を増加させることになっているが、Appleがアップデートされたアプリの露出方法を変更したため、今は必ずしも正しくない。アップデートしてもダウンロード数にごく小さな山しか出来なかったと何社かのデベロッパーが報告している。売上にもっと大きく影響しているのは価格を下げることのようだが、これもまた長続きはしていない。

Appleに特集してもらうことが売上急増最大の貢献要因だ。Appleのプロモーションの威力は、予想どおりデベロッパーが経験する売上増に反映されている。「ニューリリースと注目作品」のコーナーは「スタッフのおすすめ」や「What’s Hot」に比べてやや効果が小さい。一般的にいって、特集されると2~20倍の売上増加が見込まれ、平均値に戻るまで1週間程度続くと考えてよさそうだ。ここでのポイントは、この急上昇を利用してアプリをトップリストに押し上げることにある ― 全体のトップ100でも、特定部門や国内のトップリストでもよい。一たびリストに載れば、そのアプリはさらに上位へと昇り、高水準の売上を維持できるチャンスが生まれる。

マーケティングの観点でも同じ戦術が使える。特集される可能性はどのアプリも同じではないが、短い期間を区切ってプロモーションを集中することが重要だ。長期にわたってマーケティングや広告を行うのではなく、短期間(できれば何日の単位)に集中することで、アプリがトップリスト入りするための効果がずっと高くなる。

それでは具体的なアプリケーションを見てみよう。正確な理解のためには各アプリをクリックして確認することをおすすめする。プロダクションバリュー、複雑さ、ニッチ、価格それぞれによって、すばらしい売上になるか微々たるものになるかが決まる。以下のリストは集めたデータの中で売上高の範囲に含まれる50種類のアプリケーションによる。

App Name Total Sales Days in Market App Price
Xpong 20 210 0.99
ShingleNav 28 156 4.99
Fumbers 62 40 1.99
Greenthumb! 87 231 1.99
FastTrac 199 60 4.99
splojit 217 238 0.99
Size Convert 354 210 0.99
Handbook of High-Risk Obstetrics 436 210 49.99
Traveler’s Quest 532 97 2.99
Cougar Call 800 229 0.99
Seasonalysis 1000 200 49.99
The Power of Now, by Eckhart Tolle 1179 223 13.99
Star Ride 1200 270 2.99
Star Fusion 1323 217 0.99
Germs 1465 102 0.99
iWasted 1500 201 0.99
Silly Songz 2000 365 0.99
School timetable 3648 395 0.99
Pi Cubed 3775 316 9.99
CardSnap 4690 342 14.99
Adaptunes 4754 272 0.99
Theme Park Madness 4788 367 2.99
Birthday Reminder 10000 250 1.99
Craigly 10000 400 0.99
EleMints 10224 505 4.99
Gridlocked: Traffic Control 12500 270 0.99
MeetMe. 15000 180 0.99
MicroCars 16613 230 1.99
Green Screen Studio 17025 210 2.99
NineGaps 18120 278 0.99
Distant Suns 20000 450 6.99
Numerology 34905 518 4.99
iEscaper! -Escape From the Ninja’s Lair- 35000 215 2.99
TapFormsDatabase 35100 517 8.99
A Doodle Flight 38000 225 0.99
Mini Touch Golf 40000 596 0.99
Art Envi 40000 580 0.99
Mover+ 46000 195 2.99
Orbital 50000 180 1.99
Scanner Pro 52514 143 6.99
Movie Challenge 53402 475 1.99
Formula Racing 127483 127 0.99
Stitch’em Words 200749 353 1.99
Air Hockey 300000 578 0.99
Finger Physics 418000 155 0.99
Fling! 500000 205 0.99
Moto X Mayhem 800000 218 0.99
PocketGuitar 1300000 530 0.99
Flight Control 2000000 361 0.99
Bejeweled 2 3000000 600 2.99

よく使われているマーケティング技法は、Facebook、フォーラム掲載、Twitter、自社ウェブサイト、プレスリリース、LikedIn、 アプリレビューサイト、ブログ、友人、コンテスト、YouTube、広告(印刷、クリック課金、バナー)、チラシ、ニューズレター、Flashデモ、実社会ネットワーク、ポッドキャスト等。どの手法も何らかの意味でデベロッパーを手助けしているが、アプリ製品の成功を真に左右するのはAppleとその選択の手にかかっている。他の業界で成功したアプリ(タイアップ)は、その関係によって膨大な利益を得ている。同じことは、既にウェブで知られているデベロッパーについても言える。

今のiPhoneアプリの市場は、ほんの数年先どうなるかを考えると、まだ初期段階にあると言ってよい。すでに20万を超えるアプリが公開されているが、これまでのペースをみると100万になるのも遠い先の話ではない。上記の売上分析は、現状の概要を理解する出発的になるはすだが、必ずしも個々のアプリの成否を表すものではない。週末に作って何百万ドルを稼いだアプリもあれば、何ヵ月もかかって事実上売上ゼロのものもある。デベロッパーはニッチを見つけてすばらしい幸運をつかもこともできるし、高いプロダクションバリューを持つ最高の製品を生み出すこともできる。結局は、後者の方が成功への安全な道のりだ。さあ、動き始める時だ。

Posted by 김반장78
,
Posted by 김반장78
,
강좌라기 보다는 내가 배우면서 찾아본 자료는 최신버전의 강좌가 없어서 
설정이나 메뉴구성이 미묘하게 다른 부분에 다른초보분들이 망설이지 않고 따라할수 있게..
이건 핑계고 걍 이런거라도 남기면서 하면 좀더 재미있을까 하는...

이번편의 목적은 윈도우 베이스의 어플에 뷰를 추가하는 과정을 해봄으로서 뷰나 기타 라이브러리의 추가에
익숙해지기 위해서 이다.

실행환경은 Xcode 3.2.4

순서는
1. 프로젝트 생성
2. 클래스파일 생성
3. 클래스파일 코딩
4. 인터페이스 빌더 작업
5. 완성

1. 프로젝트 생성
새프로젝트 생성에서 Window-based Application  선택

2. 클래스 파일 생성
생성하고자 하는 폴더 위에서 마우스 우클릭후 Add - New File.. 선택

UIViewController 를 선택

위에 클래스명을 적당히 적어주고 바로 밑의 Also Create 를 체크한다
언제나 그렇듯 명명은 중요하다 적당히 잘 적어넣자.
피니쉬 버튼을 누르면 3개의 파일이 생성된다.
그중 확장자가 xib인 화일은 이름을 다시 바꿔주는것도 좋을듯 하다. 혼동되기 쉽다.
그리고 폴더도 class 폴더보단 Resources 폴더가 더 어울리는 것같다. 옮겨주자.

3. 소스 수정
Project명이 Test라면 프로젝트 생성시에 TestAppDelegate.h TestAppDelegate.m 파일이 생성되었을것이다.

TestAppDelegate.h  

------------------------------------------------------------------

#import <UIKit/UIKit.h>

@class WelcomeCtr;


@interface TestAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;

    WelcomeCtr *welcomeCtr; //추가

}


@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain) IBOutlet WelcomeCtr *welcomeCtr;  //추가


@end


------------------------------------------------------------------


TestAppDelegate.m


------------------------------------------------------------------


#import "TestAppDelegate.h"

#import "WelcomeCtr.h"


@implementation TestAppDelegate


@synthesize window;

@synthesize welcomeCtr;   //추가


#pragma mark -

#pragma mark Application lifecycle


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    

    // Override point for customization after application launch.

[window addSubview:welcomeCtr.view];   //추가

    [window makeKeyAndVisible];

    

    return YES;

}



- (void)applicationWillResignActive:(UIApplication *)application {

    /*

     Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

     Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

     */

}



- (void)applicationDidEnterBackground:(UIApplication *)application {

    /*

     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 

     If your application supports background execution, called instead of applicationWillTerminate: when the user quits.

     */

}



- (void)applicationWillEnterForeground:(UIApplication *)application {

    /*

     Called as part of  transition from the background to the inactive state: here you can undo many of the changes made on entering the background.

     */

}



- (void)applicationDidBecomeActive:(UIApplication *)application {

    /*

     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

     */

}



- (void)applicationWillTerminate:(UIApplication *)application {

    /*

     Called when the application is about to terminate.

     See also applicationDidEnterBackground:.

     */

}



#pragma mark -

#pragma mark Memory management


- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {

    /*

     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.

     */

}



- (void)dealloc {

[welcomeCtr release];   //추가

    [window release];

    [super dealloc];

}



@end


------------------------------------------------------------------


4. 인터페이스 빌더 작업

Overview창에서 MainWindow.xib 파일을 더블클릭하면 인터페이스 빌더가 실행된다
라이브러리창에서 View Controller 를 끌어다가 MainWindow.xib창에다 놓는다.
라이브러리창이 보이지 않는다면 인터페이스 빌더 상단 메뉴에서 View - Library를 선택한다.
이작업은 생성한 뷰객체를 넣을수 있는 공간을 마련한다고 생각하면 될듯하다.


생성된 View Controller 객체를 클릭후 상단의 파란색 Inspector 버튼을 클릭하면 오른쪽의 어트리뷰트창이 열린다.
첫번째 탭을 선택후 NIB Name 을 생성한 xib 파일명으로 선택해준다


마지막 탭을 선택후 Class에 자신이 생성한 클래스 파일을 선택해준다.

마지막 작업이다.
스샷에는 Finder App Delegate 라고 되있지만 자신의 프로젝트명 App Delegate 를 선택하고 마우스 우클릭을 하면
밑에 보이는 검은색 팝업이 열린다.
welcomeCtr 옆의 속이 비어있는 원을 클릭후 오른쪽의 Welcome Ctr 에다가 끌어다 놓는다.


잘 되었다면 아래의 화면처럼 되었을 것이다.


이걸로 끝이다 
별내용 아닌데 길어졌다.

아이폰에서 실행시켜보면 새하얀 화면이 나오는것을 확인할수 있다.
이작업이 귀찮다면 가장위의 화면에서 View-base 앱을 선택해주면 지금까지의 작업이 완료된 프로젝트가 생성된다. 
먼짓한거야...
Posted by 김반장78
,
구글링을 통해 찾아냈다.
거의 예전 버전밖에 없어서 고생..

실행기반은 Xcode 3.2.4 iPhone 4.1

인증서 만들기

  1. Open up Keychain Access in Applications>Utilities.
  2. Go to Keychain Access>Certificate Assistant>Create a Certificate.
  3. For ‘Name’, type: iPhone Pwned Developer
  4. For ‘Identity Type’, leave it as ‘Self Signed Root’.
  5. For ‘Certificate Type’, choose ‘Code Signing’.
  6. Check the box for ‘Let me override defaults’.
  7. Click on Continue, and in the popup box that comes up.
  8. Type in any number under ‘Serial Number’.
  9. Leave ‘Validity Period (days)’ alone.
  10. Click on Continue.
  11. Fill in the details with whatever you want (not really necessary).
  12. Click on Continue.
  13. Click on Continue for the rest of the dialog boxes.

Xcode 설정

  1. Open /Developer/Platforms/iPhoneOS.platform/Info.plist with Property List Editor.
  2. Look for all ‘XCiPhoneOSCodeSignContext’ VALUES. Replace that with ‘XCCodeSignContext’. There should be two or three to replace.
  3. Save the file.
  4. Restart Xcode, and build your app for a device.

Open up your project settings in Xcode (Project>Edit Project Settings), go to the Build tab, and under ‘Code Signing’, extend ‘Code Signing Identity’, and choose ‘iPhone Pwned Developer’, which should be the name of the certificate you just made above.

스샷은 필요없지 싶다.
버전하나 올라갈때마다 화면이 바껴서 크게 소용없을듯..

Posted by 김반장78
,