아이폰어플개발정보2010. 6. 24. 14:12
iPhone Development Guide

A framework is a directorythat contains a dynamic shared library and the resources (such as header files,images,helper applications,and so on) needed to support that library.


YoualwaysusetheOpenGLframeworkinconjunctionwiththeEAGLinterfaces (theinterfacebetweenyourOpenGLESdrawingcodeandthenativewindowobjectsofyourapplication).


Mobile users typically want only the mostimportant information,in the least amount of time.


WindowsuseCoreAnimationlayerstoimplementtheirdrawingsurface.


DisplayingdifferentscreensofinformationinaniPhoneapplicationisdonebyswappingoutcustomviewsfromtheapplicationwindowratherthanbychangingthewindow.


iPhone OS–based devices support two instruction sets,ARM and Thumb.

- ARM: better performance for floating-point code

- Thumb: about 35% smaller code


** Configure computer and device **

1.Specify your application ID.

2.Register your device with the Program Portal.

3.InstalliPhone OS on your device.

4.Obtain your development certificate.

5.Add your development certificate to your key chain.

6.Obtain your provisioning profile.

7.Add your provisioning profile to Xcode.

8.Installyour provisioning profile on your device.


Althoughthedefaultimageincludesthestatusbarasitlookedwhenthescreenshotwascaptured,iPhoneOSreplacesitwiththecurrentstatusbarwhenyourapplicationlaunches.


** NSZombieEnabled facility **

1. Choose Project > Edit Active Executable to open the executable Info window.

2.Click Arguments.

3.Click the add (+) button in the “Variables to be set in the environment” section.

4.Enter NSZombieEnabled in the Name column and YES in the Value column.

5.Make sure that the check mark for the NSZombieEnabled entry is selected.


The Instruments application lets you gather a variety of application performance metrics,such as memoryand network use.You can gather data from iPhone applications running in iPhone Simulator or on devices.


** limitations of iPhone Simulator

Maximum of two fingers

Accelerometer (supported in SDK 3.0+, but not successful yet)

OpenGLES


** conditional compilation **

: for differently implemented frameworks between simulator and device (OpenGL ES, CFNetwork)

TARGET_OS_IPHONE

TARGET_IPHONE_SIMULATOR


** conditional linking **

target > info > Build pane > All Configurations > All Settings > Linking group > Other Linker Flags > [SDK condition, Architecture, setting value]


** syncing test application **

1. Run iTunes

2. Drag the Provision profile to the Library group

3. Drag the application to the Library group

4. sync the device


** crash report **

iTunes downloads the records the next time you connect your device.

- Mac~/Library/Logs/CrashReporter/MobileDevice

- Vista: C:\Users\<user_name>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice

- XP: C:\Documents and Settings\<user_name>\Application Data\Apple computer\Logs\CrashReporter



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

댓글을 달아 주세요

아이폰뉴스2010. 6. 24. 11:41
한눈에 보는 iPhone vs Google Nexus One vs Motorola Droid 비교
새해 첫 포스팅이 모바일 기기 관련 포스팅이네요. 오늘 두군데서 iPhone과 Google이 새로 발표한 Nexus One 그리고 상당히 호평을 받고 있는 Motorola의 Droid 단말에 대한 비교를 봤습니다. 그래서 한눈에 보기 좋게 포스팅!!

첫번째는 위의 세가지 + Palm Pre에 대한 비교 차트가 Mashable에 올라왔네요.(via @likejazz)

하지만 역시 요즘은 동영상 시대죠. 위의 세가지 기기의 브라우징 테스트 동영상이
Engadget에 올라왔습니다.(via clien)


clien에 원문을 올리신 분이 이렇게 표현 했네요.
"아이폰 >>>>넘사벽>>> 넥서스원 >> 모토롤라 드로이드"

하하하... 멋지네요.


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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 11:39
iPhone SDK를 사용해서 xml 파싱하는 방법

by alex 4. 3월 2009 07:50


//

//  XMLReader.h

 
#import

 
@class MSearchItem;

 
@interface XMLReader : NSObject {

@private

 MSearchItem *searchItemObj;

 NSMutableString *_contentOfCurrentUserSession;

 NSMutableArray *searchList;

}

 
@property (nonatomic, retain) MSearchItem *searchItemObj;

@property (nonatomic, retain) NSMutableString *contentOfCurrentUserSession;

@property (nonatomic, retain) NSMutableArray *searchList;

 
-(void)parseXMLFileAtURL:(NSURL *)URL parseXMLFile:(NSData *)fileData parseError:(NSError **)error;

 
@end

 
 
//

//  XMLReader.m

 
#import "XMLReader.h"

#import "MSearchItem.h"

 
 
@implementation XMLReader

 
@synthesize searchItemObj;

@synthesize contentOfCurrentUserSession = _contentOfCurrentUserSession;

@synthesize searchList;

 
-(void)parseXMLFileAtURL:(NSURL *)URL parseXMLFile:(NSData *)fileData parseError:(NSError **)error

{

 NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];

 //set self as deletegate of the parser so that it will receive the parser deletegate methods callback.

 [parser setDelegate:self];

 // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.

 [parser setShouldReportNamespacePrefixes:NO];

 [parser setShouldResolveExternalEntities:NO];

 
 [parser parse];

 
 NSError *parserError = [parser parserError];

 if(parserError && error)

 {

  *error = parserError;

 }

 [parser release];

}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

 attributes:(NSDictionary *)attributeDict

{

    if (qName) {

        elementName = qName;

    }

    if ([elementName isEqualToString:@"searchList"] ) {

  searchList = [[NSMutableArray alloc] init];

 }   

 
    if ([elementName isEqualToString:@"searchItem"] ) {

        self.searchItemObj = [[MSearchItem alloc] init];

     return;

    }

 
    self.contentOfCurrentUserSession = [[NSMutableString alloc] init];

}

 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{    

    if (qName) {

        elementName = qName;

    }

 
    if ([elementName isEqualToString:@"searchId"]) {

        self.searchItemObj.searchId = [self.contentOfCurrentUserSession intValue];

        [self.contentOfCurrentUserSession release];

    }

   
    if ([elementName isEqualToString:@"engine_name"]) {

        self.searchItemObj.engine_name = self.contentOfCurrentUserSession;

        [self.contentOfCurrentUserSession release];

    }

 
 if ([elementName isEqualToString:@"icon_url"]) {

        self.searchItemObj.icon_url = self.contentOfCurrentUserSession;

        [self.contentOfCurrentUserSession release];

    }

 if ([elementName isEqualToString:@"search_string_prefix"]) {

        self.searchItemObj.search_string_prefix = self.contentOfCurrentUserSession;

  //NSLog(self.searchItemObj.search_string_prefix);

        [self.contentOfCurrentUserSession release];

    }

 if ([elementName isEqualToString:@"search_delimiter"]) {

        self.searchItemObj.search_delimiter = self.contentOfCurrentUserSession;

        [self.contentOfCurrentUserSession release];

    }

 if ([elementName isEqualToString:@"search_string_suffix"]) {

        self.searchItemObj.search_string_suffix = self.contentOfCurrentUserSession;

        [self.contentOfCurrentUserSession release];

    }

 
 if ([elementName isEqualToString:@"searchItem"] ) {

  [searchList addObject:searchItemObj];

 }

  
}

 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

 if(string){

  NSString *firstFour = [string substringToIndex:1];

  if([firstFour isEqualToString:@"\n"]){

   return;

  }

  
  [self.contentOfCurrentUserSession appendString:string];

 }

}

 
- (void)dealloc {

 [_contentOfCurrentUserSession release];

 [super dealloc];

}

 
@end



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

댓글을 달아 주세요

XCODE2010. 6. 24. 08:01
iPhone App 개발, SDK 설치하기.
전세계적으로 아이폰의 열풍은 대단하다. 전화만 가능했던 단순한 피처폰에서 뭐든지 '다' 된다는 스마트폰으로의 세대변화를 이끈 주역이라고 할 수 있다. 그리고 이러한 아이폰을 더욱 더 강력하게 만드는 애플의 CEO인 스티브 잡스의 대중을 사로잡는 마력과, 10만개를 훌쩍 넘어버린 아이폰 앱 스토어의 풍부한 애플리케이션이 있었기 때문이다.


OS X
아이폰 개발을 하기위해서는 특별한 개발 환경이 필요하다. 바로 OS X 이다. 윈도우, 리눅스와는 다른 애플만의 직관적인 OS이다. 애플은 처음 애플 컴퓨터를 만들때 부터 하드웨어와 소프트웨어를 통일하여 만들어왔다. 유닉스 기반의 안정적이고 사용하기 편안 컴퓨터를 모토로 개발해 온 것이 지금의 iMac을 만들게 되었다. 그와 함께 발전하게 된것이 OS X 이다. 이전에는 모든 부품들을 애플에서 만들었지만, 2006년 인텔의 CPU를 사용하면서 좀더 경제적인 제품을 생산하게 되었고, 부트캠프의 사용과 함께 조금은 더 나아진 호완성을 가지게 되었다. 이때부터 애플은 아이맥이 널리 알려지게 되었고, 많은 사람들이 한번쯤은 가져보고 싶은 아이템이 되었다. 인텔칩을 사용하게 된 애플덕분에 일반 컴퓨터에서도 해킨토시라 하여 불법으로 개조된 OS X 가 인터넷 상에 돌아다니게 되었으며, 이것은 애플을 더욱 더 알리는 계기가 되었다.


Objective-C
유닉스 기반의 오에스 텐은 일반적인 C언어가 아닌 오브젝티브 C 언어를 사용하고 있다. 순차적인 C의 단점을 보완한 오브젝티브 C는 객체 지향적인 관점에서 좀더 편안한 프로그래밍을 제공해주며, 유연함과, 풍부한 라이브러리, M(model)-V(view)-C(control)의 프로그래밍 구조를 확고히 하였다. 개발자들이 창의적인 생각으로 개발을 할 수 있도록 여건을 만들어 주었다.


Xcode
엑 스코드는 애플의 코코아(Objective-C)프로그래밍을 가능하도록 하는 통합개발도구이다. 너무나도 직관적인 인터페이스를 만들어주는 IB(InterfaceBulider)은 이미 많은 프로그래머로 하여금 Xcode와 코코아 프로그래밍에 빠져들게 만들었다. 코코아 터치를 사용하는 아이폰 프로그래밍은 Xcode 도구를 통해서 개발에 참여할 수 있다. 새롭긴 하지만, 조금만 해본다면 그 편리함에 놀라게 될 것이다.


Xcode for iPhone SDK 설치하기.
애플제품을 사용하는, 아니 애플 사이트에 등록한 사람이라면 누구나 Xcode를 다운로드 받을 수 있다. 물론 OS X에서만 설치할 수 있다는 단점이 있긴 하지만... 아이폰 SDK는 애플개발자센터에서 다운로드 받을 수 있다.



그림1. 애플 개발자 센터

애플 개발자 센터는 크게 세가지로 나뉘어 지는데, 맨 처음에 있는 'iPhone Dev Center'을 선택하도록 한다.


그림2. 로그인

SDK 를 다운로드 받기 위해서는 로그인이 필요하다.


그림3. 아이폰 개발자 페이지

로그인을 하면 위와 같은 화면을 볼 수 있다. 맨 위의 다운로드를 선택하여 다운로드 페이지로 이동할 수 있다. 이미 Xcode가 설치되어 있는 사람이라도 다시 iPhone SDK를 다운로드 받아서 설치하면 된다. Leopard나 snow Leopard는 상관없지만, Tiger이전의 버전은 Xcode 2.x 버전을 다운로드 받아 설치해야 한다.


그림4. iPhone SDK 디스크 이미지 파일

'iPhone SDK and Tools for Snow Leopard' 패키지를 클릭하여 설치를 진행한다.


그림5. 설치 시작 화면


그림6. 설치 동의

설 치를 하는데는 그리 어려운 부분들이 없다. 설치에 관한 동의를 몇번 하고, 설치 위치, 설치 항목들을 선택하고 나면 Xcode의 설치가 완료된다.


그림7. iTunes 종료 요청 메시지.

iPhone SDK를 설치하는 도중에 iTunes가 실행되고 있다면 위와 같이 종료하고 설치를 진행해 달라는 메시지가 나온다.


그림8. 설치 완료.

설치가 진행되고 위와 같이 설치가 완료되었다는 메시지를 볼 수 있다.


그림9. iPhone SDK의 실행파일 위치

iPhone SDK(Xcode)는 자신의 하드의 'Developer -> Applications' 디렉토리에서 Xcode라는 실행파일을 찾을 수 있다.


그림10. iPhone SDK 실행 화면.

Xcode를 실행하면 환영 메시지 후에, 위와 같은 화면을 볼 수 있을 것이다. 왼쪽에 보면 알 수 있듯이, 윗부분은 아이폰 애플리케이션을 위한 프로젝트가 있고, 아래쪽에는 OS X 애플리케이션을 위한 텝이 자리하고 있다. 이제부터 하나씩 아이폰 개발을 배워보도록 하자.





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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 08:00
iPhone 시뮬레이터를 실제 사용하는 것 처럼!
아이폰 개발을 하기 위해 필요한것은 개발 도구와, 개발한 애플리케이션을 실행해 볼 수 있는 아이폰이나, 아이팟 터치일 것이다. 하지만, 아이폰/아이팟 터치가 없다면?? 컴퓨터는 누구나가 다 가지고 있기 때문에 해킨토시를 하던, VMware를 통해 설치하는 등의 방법을 통해 설치 할 수 있지만, 없는것을 만들어 낼 수는 없는 노릇이다. 그리고 매번 동기화 시켜서 테스트 할 수도 없는것이고... 다른 개발 툴들도 마찬가지겠지만, 아이폰 SDK에는 실제 실행환경과 매우 유사한 iPhone simulator 가 준비되어 있다.



아이폰 시뮬레이터 실행하기.
Xcode 로 애플리케이션을 작성하고 'Run and Build' 버튼을 누르면 소스코드가 빌드되고, 자동으로 아이폰 시뮬레이터가 실행이 된다. 그리고 지금 개발중인 애플리케이션이 실행한 상태의 화면이 나타나게 된다. 애플리케이션은 실행하지 않은채로 아이폰 시뮬레이터만 실행해 보고 싶다면 HardDisk -> Developer -> Platforms -> iPhoneSimulator.platform -> Developer -> Applications 의 순서로 폴더를 따라가다 보면 'iPhone Simulator' 실행 파일을 만날 수 있다. 이 파일을 더블 클릭하면 아이폰 시뮬레이터가 실행된다.


손가락이 없다면 마우스로...
아이폰을 가장 잘 활용하기 위한 도구는 우리 모두가 가지고 있는 손가락이다. 하지만 아쉽게도 컴퓨터에는 손가락이 없다. 대신에 마우스라는 친근한 도구가 우리에게 있다. 마우스와 마우스의 버튼은 우리가 손가락으로 아이폰에 입력할 수 있는 대부분의 입력을 충분히 입력할 수 있도록 해준다.


그림1. 아이폰 시뮬레이터의 입력

Mouse Click : 마우스를 원하는 곳에 이동한 후 클릭하는 것을 손을 아이폰의 화면에 대는 것과 같다고 할 수 있다. 무엇인가를 선택할 때 사용되고, 버튼 형식의 객체를 컨트롤 할 수 있다.
Mouse double Click : 마우스를 더블클릭하는 것은 손가락으로 빠르게 두번을 탭하는 것과 같다. 취소를 하거나, 화면 전환을 할 때, 탭 이외의 추가적인 입력이 필요할 때 사용 할 수 있다.
Mouse Click & Drag : 마우스를 클릭한 상태에서 드래그를 하는 것은 손가락을 아이폰의 화면에 대고 끄는것과 같은 역할을 하게 된다. 매우 큰 화면을 볼 때 이리저리 움직일 때 사용하거나, 화면 전환에 유용하게 쓰이는 제스쳐이다.
'option' + Mouse Click & Drag : 'option' 키를 누른 상태에서 마우스를 클릭하면 위의 화면과 같이 두개의 원이 생기게 되는데 이것은 두개의 손가락을 의미한다. 이것을 드래그하면 손가락의 간격을 줄이거나 늘이거나 할 수 있는데, 화면을 확대하거나 축소할때 손쉽게 사용하는 제스쳐이다.


아이폰 흔들기.
아이폰의 주요 특징의 하나는 위치와 방향에 대한 감각이 뛰어나다는 것이다. 아이폰을 ‡뗌隔킬


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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 07:59
[강좌] iphone 개발자들을 위한 스터디 로드맵
원문: http://cafe.naver.com/mcbugi/8379
이 강좌는 지극히 개인적인 의견을 드리는 것입니다. 단지 참고로만 삼으실 정도의 가치만 있으실듯...

iphone dev center)
 - 위 문서를 한글로 번역한 문서 우리 카페 자료실에 올라와 있습니다. 

2번 xcode랑 친해지는 것은 따로 문서를 보고 하는 것 보다, nitrex88


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

댓글을 달아 주세요

아이폰기본사용2010. 6. 23. 21:12
'아이폰 상식' - iPhone 해킹시 자주 언급되는 용어들...

1. 펌웨어

많이들 아실겁니다...

기기를 운영할수 있게 만든 각종 OS나 설정 등을

저장한 화일입니다...기기의 오작동이나 에러를

 소프트웨어로 수정할때 펌웨어를 업그레이드해서 해결을 하죠...

아이폰의 경우 1.0.0 에서 현재 1.1.3 까지 나와있는 상태입니다...

초기 아이폰 펌웨어는 대략 90-100 메가 정도였으나

 현재는 150 메가 정도 됩니다...

2. 액티베이션

아이폰은 전화기입니다...

당연히 전원을 넣고 심카드를 넣으면 전화가 되어야 합니다...

그러나 우리의 위대한 잡스형님께서는 이익의

 극대화를 꾀하고자 미국의 AT&T와 2년간의 미국내

독점 계약을 하시게 되죠...

그래서 아이튠즈를 통한 AT&T 인증을 받은 전화기만

 제대로된 기능을 발휘하게 막아 놓으셨답니다...

이 인증 과정을 액티베이션이라고 하면 처음 인증시 15불인가

하는 수수료 까지 내야 한다는 어처구니 없는 상황입니다...

아이폰이 전화로써의 제 기능을 하기 위해

처음 통과해야 하는 과정이 액티베이션입니다...

전화기능이 없고 아무런 독점 제약이 없는 아이팟

 터치의 경우 액티베이션 과정이 당연히 없습니다...

2. 제일브레이크

다들 탈옥이라고 알고 계신 그놈입니다...

아이폰은 용량에 따라 초기 4기가에서 현재의 16 기가까지의

 저장 공간을 가집니다...

그중 약 300 메가를 시스템 파일 영역이라 하여 OS 및

어플리케이션이 설치되어 있고 

8 기가짜리라면 약 7.7 기가 정도의 저장공간이 음악과

동영상용으로 사용되어집니다...

하지만 우리의 위대한 해커님들께서 이 공간을 사사로이(?) 이용하시고자

접근이 거부된 화일 디렉토리 시스템에 접근하여

 읽기와 쓰기를 인위적으로 가능하게 만드는 작업...

이것이 바로 제일브레이크 입니다...

그러니까 접근이 거부된 아이폰 내부를 유저가 마음대로

 비공식 어플리케이션을 깔고 지우고 사용할수 있게 하는 과정을

제일브레이크라고 하는 것입니다...

이 과정을 거치지 않으면 우리는 단순히 아이튠즈를 이용해서

 음악과 동영상의 동기화 만을 해야합니다...

3. 언락

액티베이션 & 제일브레이크와 상당히 혼동하시는 개념입니다...

액티베이션과 제일브레이크 그리고 언락은 완전히 다른 말입니다...

초기 락을 푼다는 의미에서 액티베이션,

자일브레이크와 혼동해서 사용했지만

개념을 확실히 잡으셔야 합니다...

언락은 GSM 캐리어를 유저가 마음대로 사용할수 있게

 전화기의 Sim 카드 락을 푸는 것을 말합니다...

원래 AT & T 만을 사용하도록 락이 걸린 아이폰을 기타

다른 GSM 캐리어의 심카드를 인식시켜

전화로써의 기능을 수행하게 만드는 것... 바로 이 해킹

 과정이 언락입니다...언락을 하게되면 여타 전세계

 모든 나라의 GSM 망에서 사용 가능한 심카드를

 아이폰이 인식을 합니다...

이 과정을 거치지 않으면 올바르지 않는 심카드라는

오류 메세지가 뜨며 전화 기능이 활성화 되지 않습니다...

GSM 망을 사용하는 나라에서 아이폰을 전화기로

사용하기 위한 필수 과정입니다...

망할 WCDMA 국가인 한국과 일본은 전세계에서 열외입니다.

4. 부트로더

부트로더는 말 그대로 오에스를 부팅해서

기기가 작동할수 있게 만드는 영역입니다...

하지만 불행히도 애플에서 위에 언급한 언락을 막기 위해

 이 영역에 락을 걸어 버려 언락을 못하게 만들었습니다...

그것이 한때 공포의 대상이였던 부트로더 3.9 와 4.6 입니다...

현재 부트로더 3.9에 대한 소프트웨어 심언락은 완료되었고

 순수 4.6에 대한 것도 처음 아이폰을 하드웨어적으로 언락했던

어린 친구가 작업중이라고 합니다...

5. 모뎀 펌웨어

말그대로 전화기능을 사용하기 위한 전화

 모뎀의 펌웨어 버전입니다...

04.03.13G 뭐 이런 말들 많이 들어 보셨을 겁니다...

위에 언급한 언락을 위해 반드시 해킹을 해야 하는 부분입니다...

1.1.1, 1.1.2, 1.1.3 등 아이폰의 펌웨어가 올라가면

 따라서 모뎀 펌웨어도 올라갑니다...

언락을 하기 위해 1.1.3의 펌웨어에서 모뎀 펌웨어만

1.1.2 용 모뎀 펌웨어로 다운그레이드한후

언락을 진행하여 다른 통신사 심카드를 사용하는

방법등이 해커들을 통해 이루어 졌습니다...

이것을 막고자 위에 말씀드린 부트로더에 락을 건것입니다...

아무튼 언락을 하시려면 반드시 이해하고

넘어가야할것이 모뎀 펌웨어입니다...

6. 데브팀? 네이트 트루? 지브리?

해킹을 따라하다보면 많이 나오는 이름들입니다...

한마디로 각자 아이폰을 해킹했던 해커들 이거나 모임입니다...

네이트 트루는 ibricker 라는 윈도우용 액티베이션과

 언락툴을 최초로 만든 사람입니다...

펌웨어 1.1.1 이전까지는 ibricker 가 대세였습니다...

1.1.1에서 아이폰 펌웨어의 보안구멍을 이용해서

비상전화로 액티베이션과 제일브레이크하는 방법이

 나오기 전까지는 말입니다... 

이번 1.1.3 언락 과정에서 데브팀과 협력하다 의견

 충돌로 데브팀보다 먼저 1.1.3 제일브레이크를

독단적으로 공표한 인물입니다...

그 일로 데브팀에서 네이트 트루를 매장하려고 한다는

루머까지 있었습니다... 사실일지도 모릅니다 ^^*

아무튼 가장 먼저 해킹방법을 선보인 네이트 트루는

 그 일로 인스톨러에서 자신의 툴들이 삭제되는 치욕을 맛보고

데브팀에서는 이런 저런 이유로 네이트 투르는

법적 조치를 당할꺼라는 말을 공공연히 합니다...

하지만 분명히 말씀 드릴수있는것은 현재의 어떤

해킹툴보다 네이트 트루의 툴이 문제가 없었으며

권한 설정 문제나 이런 것이 전혀 없는 가장 이상적인

 방법이였다는 것입니다...

그 후 데브팀이 1.1.3-3 까지 업데이트 하며 자일브레이크에

 따른 권한 문제등을 고치려했지만 불완전하구요...

항간에는 데브팀이 애플과 모종의 결탁을 했다는 말이있습니다...

그것 때문에 네이트 트루나 지브리 같은 사람들이

다른 해커들과 함께 데브팀과 결별했다는 설도 있구요...

그리고 지브리는 마찬가지로 ziphone 이라는

혁신적인 해킹 툴을 만든 사람입니다...

기존의 해킹방법은 1.1.1 펌웨어로 돌아가서 액티베이션과

 제일브레이크를 하고 다시 1.1.2로 업데이트하고

거기서 다시 제일브레이크를 하고 그리고 최종적으로

1.1.3 으로 업데이트하는 것이였지만

지브리는 혁신적으로 순정 1.1.3 펌웨어에서 단 45초만에

 엑티베이션과 제일브레이크를 하는 툴을 공개합니다...

데브팀에 의해 그 효과가 공격 당하고 구라라는

 말까지 있었습니다...

아이폰 펌웨어 기반이라 아이폰에서의 성공률이

 상당히 높은 해킹 툴입니다...

다만 BSD 무한 루프 같은 문제로 인해 아직까지는

 배척 당하고 있습니다...

하지만 성공만 한다면 가장 쉽고 편한 해킹

 툴이라는데는 이견이 없습니다...

액티베이션과 제일브레이크 45초...

언락까지 4분 30초...

이보다 더 쉽고 편한게 있을까요?

7. 복원

펌웨어 리스토어 즉 기기를 초기 상태로 돌리는 것을 말합니다...

아이튠즈를 실행하면 아이폰을 인식하고...

인식된 장비란의 아이폰을 찍으면 첫 화면에 업데이트와

 복원 단추가 보이죠...

여기서 복원 버튼을 누르면 아이폰은 초기 상태로 돌아갑니다...

액티베이션부터 다시 해야되는 상태를 말합니다...

다만 마지막에 인스톨된 펌웨어 버전으로 복원됩니다...

산지 1년 된 초기 1.0.0 버전 아이폰이더라도 1.1.3 펌웨어로

업데이트 해서 사용하다가

복원을 누르면 1.1.3 펌웨어가 깔린 초기 상태로

 복원된다는 말입니다...그럼 최신 펌웨어로만 복원이 되느냐?

네 그렇습니다... 원래는 그런줄 알았습니다만...

우리의 똑똑한 해커님들이 방법을 찾아냈죠...

이름하여 강제 펌웨어 다운그레이드...

아이폰은 복구모드라는 것이 존재합니다...

아이튠즈에서 복원 키를 눌러서 복원하는 것은

일반적인 복구 입니다... 아래 버전으로의 펌웨어

다운로드가 이루어질수 없습니다...

그렇기 때문에 강제 펌웨어 다운로드를 위해서는 일명

 DFU 모드라는 것을 만들어 주어야 합니다...

쉽게 DFU 모드를 만들어 주는 프로그램도 있습니다...

예전부터 쓰던 수동 방법으로는 홈키와 전원키를

 계속 누르다 보면 전원이 꺼졌다가 다시 켜지며

 사과 로고가 나옵니다... 

이때 홈키는 누른채 전원 버튼에서만 손을 떼면

화면에 아무것도 나타나지 않는 검은 바탕이 되면서

아이튠즈가 복구 모드를 인식하고 팝업이 됩니다...

여기서 쉬프트 키를 누르고 복원 버튼을 눌러 다운그레이트할

펌웨어를 눌러주면

강제로 기기의 펌웨어가 지정된 하위 버전으로 복원되는 것입니다...

아이폰이 벽돌이 됐다고 걱정하시는 분들께서는 이

방법으로 복원 모드로 들어가서 복원을 하면 벽돌이 풀립니다...

몇가지 복원 방법을 알려드리면...

- 홈 + 전원키 계속 누르고 사과 마크 나올때 전원에서 손을 땐다.

- 홈 + 전원키 아이튠즈 실행될때까지 끝까지 누르기...

- 정상적으로 밀어서 전원 끄기로 전원을 끈후 케이블을

 제거하고 홈 버튼을 누른채 케이블을 연결해서

  아이튠즈가 실행되면 복원 모드로 들어가는 방법...

ziphone 2.4는 이 방법으로 복원을 한 후 제일브레이크를 하더군요... 

8. 인스톨러

제일브레이크를 실행하면 기본적으로 깔리는

 가장 기초적인 써드파티 프로그램입니다... 

인스톨러를 통해 각종 소스나 프로그램들을 무선

 인터넷으로 다운 받아 아이폰 내부에 설치하게 해주는

기초적인 프로그램입니다...

수많은 개발자들이 개발한 공짜 프로그램을 소스

 추가라는 간단한 작업을 통해

온라인으로 설치할수 있게 만드는 핵심이 바로 인스톨러입니다...

항간의 루머에는 이 인스톨러를 만든 개발팀이 애플과 계약을 맺고

향후 업데이트부터는 아이튠즈를 통해 유료로

 할꺼라는 우울한 루머가 있습니다...

제발 아니기를 빕니다...

9. 안정화

아이폰은 위에서 말씀드린대로 300 메가 정도의

시스템 영역과 나머지의 음악, 동영상 영역이 있습니다...

시스템 영역에 깔리는 운영체계와 어플들로 인해 시스템

영역의 용량은 20메가 전후밖에 남지 않습니다...

그곳에 제일브레이크를해서 프로그램을 깔면 몇개 못깔겠죠?

그래서 나온것이 안정화라고 얘기하는 것입니다...

용량을 많이 차지하는 폰트 폴더와 어플리케이션

 폴더를 다른 영역으로 옮기고

권한을 부여해 마치 옮기지 않은것 처럼 꾸미는 일...

이것이 안정화 입니다...

인스톨러에서 설치한 보스툴을 이용해서 폰트

이동과 어플리케이션 이동을 마치면

초기 20메가 남짓이던 시스템영역의 남은 용량이 약

100 메가 이상으로 늘어납니다...

그만큼 인스톨러로 깔수 있는 써드파티 어플리케이션의

 양이 늘어난다는 것이지요...

-애플 아이폰-



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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 22. 17:53
iPhone OS 개요

원문은 Getting Started의 iPhone OS Overview 입니다.

<차례>

1.iPhone OS 개요
2.iPhone OS 기술 레이어

3.iPhone OS에서의 코딩

4.어디서부터 시작해야 하나

1.iPhone OS 개요 +-----+-----+-----+-----+-----+


IPhone OS는 Mac OS X의 많은 부분을 바탕으로 만들어져 있지만 모바일 환경에 맞는 독자의 기능(멀티터치, 가속도 센서 등)
또한 제공하고 있다.


iPhone SDK는 코드와 정보, 개발툴, 테스트/디버깅/실행/튜닝 환경을 포함하고 있으며
Xcode툴은 iPhone OS개발을 서포트하기 위해 업데이트 되어왔다.


2.iPhone OS 기술 레이어 +-----+-----+-----+-----+-----+


■ Core OS / Core Services


iPhone OS를 위한 기본 인터페이스(파일 억세스, 하위레벨 데이터타입, Bonjour서비스, 네트워크 소켓 등)를 제공.
이 인터페이스들은 대부분 C로 구현되어 있으며 Core Foundation, CFNetwork, SQLite, POSIX 스레드 접근, UNIX 소켓 등의 기술을 포함한다.


■ Media


이 레이어는 C와 Objective-c의 혼합으로 구현되어 있으며 2D / 3D / audio / video 를 서포트하는 기술을 제공한다.
이 중 C를 기반으로 한 기술은 OpenGL ES, Quartz, Core Audio이며 Objective-c는 애니매이션 엔진인 Core Animation을 제공한다.


■ Cocoa Touch


대부분이 Objective-C로 구현되어 있으며 유저 어플리케이션 개발에 있어서 기반이 되는 기술이다.
예를 들면, 기본 프레임워크는 컬렉션의 객체지향, 파일 관리, 네트워크 조작등을 제공한다.
UIKit 프레임워크는 유저 어플리케이션의 비쥬얼 기반(윈도, 뷰, 컨트롤, 그리고 이 오브젝트들을 제어하는 컨트롤러 등)을 제공한다.
또한 이 레이어의 다른 프레임워크들은 연락처, 사진첩, 다른 하드웨어 디바이스의 접근등을 제공한다.


이 레이어가 바로 개발자의 스타트 포인트이며 추천하고 있는 지점이다.
상위 레벨의 프레임워크는 최소의 노력으로 최대의 효과를 얻을 수 있게 작성되어 있으며
개발자가 하위 레벨 기술의 사용을 고려해야 할 때는 오직 상위 레이어가 제공하지 않는 부분을 커버해야 할 때이다.


 

3.iPhone OS에서의 코딩 +-----+-----+-----+-----+-----+


iPhone SDK는 iPhone OS에서 네이티브하게 움직이는 어플리케이션을 작성하게 해준다.
어플리케이션은 유저의 홈 스크린에 상주하며 실행후에는 몇몇 데몬과 커널을 제외하고는 유일하게 실행되고 있는 어플리케이션이 된다.
이는 자원의 풀 억세스를 가능하게 하며 내장하드웨어(기속도 센서, 카메라, 화면등)에 접근하여 실행시킬수 있다.


iPhone 어플리케이션을 사용하는 유저들은 매우 직관적으로 필요한 기능을 판단하길 원함으로 개발자는 그 점을 잘 고려하여 설계하는것이 좋다.


일단 UIKit에 정통하라. 그 후에 다른 기술을 알아 나가는 것이 더 좋다.
각 프레임워크에 대한 문서들은 그 후에 알아 나가야 할 관련 기술에 대한 정보를 제공하고 있다.


<영문 링크>
기본 프레임워크
UIKit 프레임워크


4.어디서부터 시작해야 하나 +-----+-----+-----+-----+-----+


iPhone OS에서 돌아가는 아주 간단한 프로그램을 만들기란 너무 쉽다. 그냥 Xcode의 템플렛에서 만들어보면 된다.
하지만 제대로 된 유용한 어플리케이션을 만들고 싶다면 어느정도 시간을 투자하여 문서를 읽어 볼 필요가 있다.


■ iPhone OS나 Mac OS X 를 처음 접하는 사람이라면


기본 프레임워크로부터 공부한다면 좀 더 시간이 걸린다. 시작은 iPhone OS의 디자인 패턴으로 하자.
문서명은 Cocoa Fundamentals Guide 이며 이는 Objective-C, UIKit의 디자인패턴과 그 외 시스템 디자인 패턴을 포함한다.

■ iPhone 어플리케이션에 어느정도 익숙하다면


특정 기술을 참조하기 위하여 iPhone Application Programming Guide 를 읽자.
특정 기술을 어떻게 사용하여야 하는지, 코딩 예제와 iPhone OS의 특징을 살리는 방법등이 나와있다.
또한 Xcode사용법과 전체 개발 프로세스에 대한 설명도 나와있다.


이 문서에는 풀 코드가 들어있는 샘플도 많이 포함되어 있는데 이는 실제 어플리케이션이므로 이를 다운받아 공부하는 것도 매우 좋은 방법이다.



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075714146
Posted by 오늘마감
TAG iPhone, os, 개요

댓글을 달아 주세요

오브젝트C2010. 6. 22. 09:48
iPhone 과 Objective-C(C 언어 개발자가 궁금 했던 것들)


objective-c 공부하면서 궁금하고 생소한 내용

@synthesize

@selector

@protocol



다음 싸이트 번역본중 일부 입니다..
http://wisdom.sakura.ne.jp/programming/objc/index.html
그리고 다음싸이트도 참고 합니다.
http://theeye.pe.kr/



클래스 메서드 & 인스턴스 메서드


Object 클래스는 Object 클래스를 포함하여 그것을 상속하는 클래스의 인스턴스를 제대로 생성 alloc 클래스 메서드를 정의합니다. 일반적인 인스턴스 메서드는 메서드를 호출하는 인스턴스가 필요하지만 클래스 메서드는 인스턴스없이도 실행될 수있다는 성질이있습니다. 따라서 alloc 메소드는 인스턴스가 존재하지 않더라도 호출에 문제가없습니다. alloc 메서드는 인스턴스를 생성하기위한 클래스 메서드이므로 자주 팩토리 메소드라고도합니다



Self

암시적 self

메서드 범위 내에서에는 임시 인수 및 선언된 변수 이외에 절대적인 변수로 self를 정의합니다.self 변수는 id 형식 항상 메서드를 호출 인스턴스를 참조합니다.즉, 메서드를 실행하는 개체 자신을 나타내는 변수가 self입니다.

self는 메소드 이외의 장소에서는 사용하지 않고 항상 메서드 않습니다 실행 코드 부분에서만 암시 값이 존재합니다.self를 사용하여 개체의 인스턴스 변수에 개체에서 볼 수있습니다.이것은 메서드의 정식 인수 변수 이름 인스턴스 변수 이름을 은폐했다 때 등에 사용할 수있습니다.




Property와 Synthesizie


Property와 Synthesizie를 이야기 하면서 왜 갑자기 MVC이야기가 나왔을까요?

이들 사이에 밀접한 연관이 있기 ‹š문입니다. 실제로 Property&Synthesize는 MVC의 Model에 해당합니다.

Property는 어플리케이션에 필요한 데이터를 신뢰할 수 있고 안전하게 보존하는데 필요한 룰을 제공합니다.

Synthesize는 Property에서 선언한 데이터들을 외부에서 합법적으로 접근할 수 있는 통로를 편리하게 제공하여 줍니다.

우선 다음을 예제 코드를 보도록 하겠습니다. 아래에 대한 의문이 있으시다면 [이글]을 먼저 읽어주세요.

// Model.h
#import <Cocoa/Cocoa.h>

@interfaceModel:NSObject{
   
NSString*data;
}
@property(copy, readwrite)NSString*data;
@end

// Model.m
#import "Model.h"

@implementationModel
@synthesize data;
@end

위와 같이 작성한 코드는 이제 다른 객체에서 다음과 같이 사용할 수 있습니다.
#import <Foundation/Foundation.h>
#import "Model.h"

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

   
Model* model =[[Model alloc] init];

   
// synthesize를 통해 생성된 setter, getter사용법
   
[model setData:@"Hello Eye!"];
   
NSLog([model data]);// Hello Eye!
   
   
// dot 문법 사용하기
    model
.data =@"Bye Eye!";
   
NSLog(model.data);// Bye Eye!

   
[pool drain];
   
return0;
}

위의 예제에서 알 수 있듯이 model객체의 data 인스턴스 변수에 접근하기 위해서는 synthesize를 통해 생성된 getter(data)와 setter(setData)를 통해 가능합니다.

혹은 C에서 익숙한 객체와 변수사이에 점을 찍는 방식도 사용가능합니다.

하지만 여기서 중요한점은 Property입니다. Model.h의 property선언 부분을 다음과 같이 고쳐볼까요.
@property(copy,readonly)NSString*data;

바뀐점은 readwrite에서 readonly로 바뀌었습니다. 실행해 보면 에러가 발생하는 것을 알 수 있습니다.

error: object cannot be set - either readonly property or no setter found

property와 synthesize를 이용해서 MVC에서 추구하는 데이터를 신뢰할 수 있고 안전하게 사용할 수 있는 방법을 손쉽게 구현할 수 있다는 것을 알게 되었습니다.

여기서 괜히 궁금한것이 생겼습니다. synthesize를 통해서 생성된 setter, getter가 해당 변수를 보호하는 것일까요 property를 통해 정의된 변수 그 자체가 보호하는 것일까요?

이 궁금증을 해소하기 위해 setter를 하나만 만들어 보기로 할까요. 코드에 다음을 추가합니다.
// Model.h
// 현재 @property설정에 readonly로 되어있다고 가정
-(void)setCustomData:(NSString*)myData;

// Model.m
-(void)setCustomData:(NSString*)myData {
   
self.data = myData;
}

이제 내가 만든 setCustomData메서드에 메시지를 전달해 보겠습니다.
Model* model =[[Model alloc] init];
[model setCustomData:@"Hello Eye!"];

이 코드를 실행해 보면 아무런 문제가 발생하지 않습니다. 해당 변수가 보호받는것이 아님을 알 수 있습니다.

앞으로는 코드를 작성할 때 @property로 지정한 변수는 될수 있다면 @synthesize를 통해 접근하는 버릇을 들여야 할 것 같습니다.



클래스 형식

Objective - C에서 생성한 클래스의 인스턴스는 id 변수에 저장할 수있습니다.id 형식은 void *를 닮은 존재 클래스에 관계없이 

인스턴스를 저장하는 일반적인 개체 형식입니다.따라서 id 변수의 실체는 컴파일 타임이 아닌 런타임에 결정된다는 

특징이있습니다.

그러나 런타임에 인스턴스 확인한다는 것은, 예를 들면 메서드를 호출하기 위해 개체에 메시지를 보낼 때 해당 메시지에

대응하는 메서드가 없을 가능성이있습니다.다음과 같은 프로그램은 그 전형적인 예입니다.

 # import <stdio.h> # import <objc/Object.h> @ interface A : Object - (void) Write; @ end @ implementation A - (void) (Write printf ( "I am the born of my sword \ n"); ) @ end int main () ( id obj1 = [A new]; id obj2 = [Object new]; [obj1 Write]; [obj2 Write] / / 런타임 오류 return 0; )


selector



Objective - C 컴파일러는 메서드를 식별하는 이름을 컴파 일할 때 내부 표현으로 변환합니다.이 메서드의 내부 표현을 선택기라고 메시지를 보내고받는 뒷면은이 셀렉터가 교환되고있습니다.메서드를 식별하기위한 내부 표현은 컴파일러에 의존하는 문제이고, 개발자가 알아야하는 범위는없습니다.개발자에게 중요한 것은이 선택기를 SEL 형식으로 취급할 수있다는 사실입니다.

메서드가 어떤 데이터로 변환되고, 어떻게 인식되고있다는 문제가없습니다.하지만 Objective - C은이 내부 표현을 SEL 변수로 취급하는 것을 보장합니다.즉, SEL 변수에는 메서드 이름을 확인하기 위하여 컴파일러가 할당 특수 코드를 저장할 수있다는 것입니다.

메서드를 식별 선택기는 @ selector 컴파일러 지시문을 사용하여 얻을 수있습니다.

@ selector (method)

method는 셀렉터를 원한다 메서드의 이름을 지정합니다.지정된 메서드의 이름이 있는지 여부는 메서드를 호출하는 경우 런타임에 결정되므로 컴파일 타임에 계산되지 않을 것입니다.

에서 얻은 셀렉터 값을 SEL 변수에 저장했다고해서, 이것을 어떻게 사용할 수있는 것일까요?선택 기가 메서드를 식별하는 성격이있는 이상, 역시 최대의 이용 방법은 함수에 대한 포인터로 동적으로 메서드를 식별하는 방법입니다.선택기에서 메서드를 호출하는 기능을 제공하는 루트 클래스입니다.

Object 클래스는 SEL 형식의 값을받는 perform 메소드가 선언되어있습니다.이 메서드는 인수로받은 선택기에서 특정 메서드를 실행합니다.

- perform : (SEL) aSel;

- perform : (SEL) aSel with : anObject;

- perform : (SEL) aSel with : anObject1 with : anObject2;

aSel를 호출할 메서드를 선택기를 지정합니다.anObject, anObject1, anObject2에는 메서드에 전달할 인수를 지정할 수있습니다.

 # import <stdio.h> # import <objc/Object.h> @ interface Test : Object - (void) Write; @ end @ implementation Test - (void) (Write printf ( "I am the bone of my sword \ n"); ) @ end int main () ( id obj; SEL method; obj = [Test new]; method = @ selector (Write); [obj perform : method]; return 0; )

이 프로그램은 Write 메서드를 나타내는 선택기를 SEL 변수 method에 저장합니다.그리고 Test 클래스의 인스턴스 obj에 perform 메시지 method를 인수로 전달합니다.perform 메소드는 주어진 선택기에서 실행해야하는 방법을 알아 실행합니다. 이 성질을 잘 이용하면 런타임에 호출하는 방법을 상황에 따라 전환과 같은 프로그램을 구현할 수있습니다.



메서드를 함수 호출

사실, Objective - C 방법의 실태는 C 함수와 동일합니다.평소에는 은폐되어 있지만 메서드는 첫 번째 인수에 자신의 

클래스를 참조하는 개체를받는 함수입니다.

메서드의 개체가 함수이다는 사실은 C 언어와 친화성이 매우 높다는 것을 의미합니다.순수한 C로 작성된 라이브러리에서 

Objective - C의 메서드를 호출하거나 개체를 이용하는 것도 무리한 이야기는 아닙니다.

Objective - C 메서드는 항상 IMP 형식으로 정의됩니다.IMP 형식은 헤더 파일에 다음과 같이 정의되어있습니다.


typedef id (* IMP) (id, SEL, ...);

이 정의에서 알 수 있듯이, Objective - C에 선언된 모든 메서드는 암시적으로 id 형식 SEL 형식의 인수를 가집니다.

첫번째 인수는 메서드를 호출하는 개체를 나타내는 변수 self합니다.두 번째 인수는이 메서드의 셀렉터를 나타내는 변수 

_cmd입니다.모든 메서드는이 숨겨진 인수가 항상 존재합니다.그런 다음 메서드 선언에 따라 인수가 결정되는 것입니다.


C 언어, 어떤 이유로 Objectiver - C에서 메서드를 함수로 호출해야하는 경우 메서드를 참조하는 함수에 대한 포인터를 

취득하면 되나요.메서드를 참조하는 IMG 형식의 포인터는 Object 클래스의 instanceMethodFor 클래스 메서드 또는

methodFor 인스턴스 메서드에서 얻을 수있습니다.


+ (IMP) instanceMethodFor : (SEL) aSel;

- (IMP) methodFor : (SEL) aSel;


aSel에는 해당 메서드 IMP, 즉 함수에 대한 포인터를 검색하고 선택기를 지정합니다.메서드는 aSel에 지정된 선택기에서 

특정 메서드의 포인터를 반환합니다.

포인터를 얻을 수있는 경우, C 언어에서도 인스턴스 메서드를 호출할 수있습니다.함수 포인터로 직접 호출, 메시지 전달보다 

신속하게된다는 점도 특징입니다.

 # import <stdio.h> # import <objc/Object.h> @ interface Test : Object - (void) Write; @ end @ implementation Test - (void) (Write printf ( "I am the bone of my sword \ n"); ) @ end int main () ( id obj; SEL method; IMP func; obj = [Test new]; method = @ selector (Write); func = [Test instanceMethodFor : method]; func (obj, method); return 0; )

이 프로그램은 Test 클래스의 인스턴스 메서드 Write에 대한 포인터를 가져, IMP 변수 func에 저장합니다.

[Test instanceMethodFor : method] 메시지있는 부분은, obj methodFor : method]로 의미는 동일합니다.

이 메시지 식을 반환 IMP 형식의 메서드의 포인터를 사용하여 직접 메서드를 호출합니다.


이미지 프로세싱 및 멀티미디어와 같은 루프 속도 향상 등이 필요한 경우에는 서신이나 선택기 통신은 부담이 큽니다.

속도에 집착하는 프로그램이라면, 필요에 따라 IMP 가져 포인터에서 메서드를 호출해도 좋습니다.





클래스에 메서드 추가

Objective - C는 클래스를 여러 파일에 나누어 선언 및 정의하는 기능을 제공합니다.이것을 분류라고 범주를 사용하면 

클래스의 메서드 선언을 나눌 수있습니다.

예를 들면, 여러 개발자가 공동으로 동시에 평행 동일 클래스의 구현을 작성하는 경우 각 개발자는 클래스 중에 개발자가

담당하는 메서드를 카테고리로 분류합니다.

카테고리를 선언하려면 반드시 기본이되는 클래스의 인터페이스 선언이 필요합니다.클래스 종류를 선언 및 정의하려면 

다음 구문을 지정합니다.


@ interfae 클래스 이름 (카테고리 명) (...

@ implementation 클래스 이름 (카테고리 명) (...


여기서 지정한 카테고리 이름은 C 언어의 식별자 명명 규칙을 따릅니다.범주 화하는 클래스는 반드시 이미 기본이되는

본체가 선언되어 있어야합니다.


분류는 일반적으로 클래스 선언과 정의와 비슷하지만, 인스턴스 변수를 선언할 수 없기 때문에주의하십시오.분류 선언할 

수있다는 인스턴스 메서드와 클래스 메서드뿐입니다.

 # import <stdio.h> # import <objc/Object.h> @ interface Test : Object - (void) WriteA; @ end @ interface Test (Fate) - (void) WriteB; @ end @ implementation Test - (void) WriteA ( printf ( "I am the bone of my sword \ n"); ) @ end @ implementation Test (Fate) - (void) WriteB ( printf ( "몸은 검으로되어있는 \ n"); ) @ end int main () ( id obj = [Test new]; [obj WriteA]; [obj WriteB]; [obj free; return 0; )

이 프로그램은 Test 클래스를 주로 Fate이라는 이름의 카테고리로 분류하고있습니다.실행 결과는 상상과 같습니다.

Test 클래스의 연속되는 모든 범주는 궁극적으로 동일한 클래스로 통합합니다.물론 분류는 다른 파일에 선언해도 

상관없습니다.만일 그렇다면, 카테고리를 선언하는 파일은 기본이되는 클래스를 선언하는 헤더 파일을 포함하고 있어야합니다.


분류는 기존의 완성하는 클래스에 기능을 추가하는 용도로 사용할 수도있습니다.그러나 인스턴스 변수를 추가하는 것은 

할 수 없기 때문에 기존 클래스의 역할 범위의 확장이라는 것입니다.

 # import <stdio.h> # import <objc/Object.h> @ interface Object (Write) - (void) Write; @ end @ implementation Object (Write) - (void) (Write printf ( "I am the bone of my sword \ n"); ) @ end int main () ( id obj = [Object new]; [obj Write]; [obj free; return 0; )

이 프로그램은 루 유익 라스이다 Object 클래스에 새 분류를 추가합니다.덧붙여서, 분류 방법이 기존 클래스의 메서드와 

충돌하면 분류 방법이 우선 기존의 방법은 은폐되어 버립니다.상속을 통해 재정과 다르기 때문에, 은폐되는 메서드를 호출하는 

방법이 없을 것이기 때문에주의하십시오.



메서드를 클래스와 공유하기

프로토콜이란 상대적으로 네트워크 용어로 사용되고 있지만, Objective - C에 한해서는 여러 클래스에서 구현되는 동일한 

이름의 메소드를 공유하기위한 메서드 선언을 말합니다 .Java 언어와 C # 언어에서는 인터페이스라는 개념에 가까운

존재입니다.

프로토콜이 사용되는 프로그램의 설계 문제에 클래스가 특정 메서드를 구현하는 것을 보장하기위한 수단으로 사용됩니다.

예를 들어 특정 라이브러리 사양에 따라 클래스는 지정된 프로토콜을 따르도록해야한다,와 같은 관계를 구축할 수있습니다.

프로토콜을 제공하는 선언된 메서드만에서 메서드의 구현이 어떤 작업을 수행할은 자유입니다.

프로토콜을 선언하려면 @ protocol 컴파일러 지시문을 사용합니다.이 가운데 프로토콜이 조건으로 지정하는 메서드를

선언합니다.

 @ protocol 프로토콜 이름 "부모 프로토콜 1, ..." 프로토콜 본체 ... @ end

프로토콜은 클래스의 상속 관계와 부모 프로토콜을 사용하여 상속할 수있습니다.프로토콜의 상속에 대해서는 뒷부분에서 

자세히 설명 하겠지만, 프로토콜 상속은 단순히 부모 프로토콜을 결정하는 방법에 새 메서드를 추가하는 의미 밖에 가지지

않습니다.프로토콜 이름은 클래스 이름과 같은 것처럼 C 언어의 명명 규칙에 따라 전문 언어 리스크를 식별하는 이름을 

지정합니다.프로토콜 본문은 메서드 선언만을 할 수있습니다.


선언했다 프로토콜은 클래스에 채택될 수있습니다.프로토콜을 지정하는 클래스는 해당 프로토콜을 채택하고있다라고 할 

수있습니다.프로토콜을 사용하는 클래스는 해당 프로토콜에 선언된 메서드를 반드시 구현해야합니다.덧붙여서, 프로토콜에 

선언된 메서드를 프로토콜을 사용하는 클래스의 선언 부에서 다시 선언할 필요가없습니다.프로토콜 종류에 사용하기 위해서는

다음과 같이 클래스를 선언합니다.


@ interface 클래스명 : 슈퍼 클래스 이름 "프로토콜 1, ..."


프로토콜은 슈퍼 클래스의 지정된 직후 ""에서 프로토콜 이름을 묶어 지정합니다.슈퍼 1 개만 지정할 수 있지만, 프로토콜은 

콤마,로 구분하여 여러 개의 프로토콜을 사용하도록 할 수있습니다.프로토콜을 사용하는 경우, 반드시 프로토콜에 선언된 

메서드를 @ implementation 부에서 구현해야합니다.즉, ぷろとこるを 채용한다는 것은 그 종류가 프로토콜 선언되는 

메서드의 구현을 보장한다는 것입니다.

 # import <stdio.h> # import <objc/Object.h> @ protocol ClassNameToString - (id) ToString; @ end @ interface A : Object ( char * name; ) - (id) init; - (id) free; @ end @ interface B : Object @ end @ implementation A - (id) init ( [super init]; name = (char *) malloc (255); sprintf (name, "% s A @ % d", __FILE__, self); return self; ) - (id) (free free (name); return [super free; ) - (id) ToString (return (id) name;) @ end @ implementation B - (id) ToString (return (id) "This is Object of B Class";) @ end int main () ( id objA = [A new]; id objB = [B new]; printf ( "objA = % s \ n", objA ToString); printf ( "objB = % s \ n", objB ToString); [objA free; [objB free; return 0; )

이 프로그램은 클래스의 이름을 나타내는 문자열을 반환하는 ToString 메서드를 선언 ClassNameToString 프로토콜을 

선언합니다.이 프로토콜을 사용하는 A 클래스와 B 클래스는 반드시 ToString 메서드를 구현해야합니다.A 클래스와 B 클래스의

상속 관계에 아무런 연계도 없지만 프로토콜을 사용하여 이러한 클래스 ToString 메서드가 구현되어있다는 것을 확실하게 

지킬 수있습니다.

실천은 클래스의 구현에 의존하지 않는 완전한 추상화된 형식으로 프로토콜을 사용하는 외에, 포인터를 사용하지 않고 메서드가

호출하는 방법으로 사용할 수있습니다.특히 GUI 환경 이벤트 처리 등이 프로토콜을 사용하는 것입니다.

프로토콜 형식으로 독립하지 않지만 형식 선언에서 형식 이름이 바로 ""에 프로토콜을 지정하기위한 변수가 지정된 프로토콜을

사용하는 것을 명시적으로 선언 수 있습니다.


모델명 "프로토콜 이름"변수 이름 ...


이것은 함수 및 메서드의 인수 선언도 지정할 수있습니다.

 # import <stdio.h> # import <objc/Object.h> @ protocol InstanceListener - (void) InstanceFree : (id) object; @ end @ interface Test : Object ( id <InstanceListener> listener; ) - (id) init; - (id) free; - (void) SetInstanceListener : (id <InstanceListener>) l; - (id <InstanceListener>) GetInstanceListener; @ end @ implementation Test - (id) init ( [super init]; listener = NULL; return self; ) - (id) (free if (listener) listener InstanceFree : self]; return [super free; ) - (void) SetInstanceListener : (id <InstanceListener>) l ( listener = l; ) - (id <InstanceListener>) GetInstanceListener ( return listener; ) @ end @ interface WriteInstanceFree : Object <InstanceListener> @ end @ implementation WriteInstanceFree - (void) InstanceFree : (id) object ( printf ( "% X : 인스턴스가 해제되었습니다 \ n", object); ) @ end int main () ( id obj1 = [Test new, obj2 = [Test new]; id <InstanceListener> listener = [WriteInstanceFree new]; [obj1 SetInstanceListener : listener; [obj2 SetInstanceListener : listener; [obj1 free; [obj2 free; return 0; )

이 프로그램은 인스턴스가 풀어 놓은 시간에 호출되는 콜백 전문 InstanceFree 메서드를 선언하는 InstanceListener 프로토콜을

선언합니다.Test 클래스는이 프로토콜을 사용하는 인스턴스를 SetInstanceListener 메서드에서 설정할 수 있고 Test 클래스의

인스턴스가 방출되기 직전에 프로토콜 메서드를 호출합니다.GUI 이벤트 처리는 이와 동일한 방식으로 처리되는 것입니다.


변수를 선언할 때, 형명 직후에 프로토콜을 지정하면 해당 개체가 지정된 프로토콜을 채택해야한다는 것을 명시합니다.

따라서 Test 클래스의 listener 인스턴스 변수는 확실한 목표 메서드가 호출 할 수있습니다.


프로토콜 상속

프로토콜은 클래스처럼 상속받을 수있습니다.프로토콜을 상속은 클래스 상속과 성격이 다르고, 실제로는 기본이되는 

프로토콜에 새 메서드 선언을 추가하면됩니다.또한, 슈퍼 클래스는 반드시 1 개만 지정할 수없습니다 프로토콜은 다중 

프로토콜을 상속할 수있습니다.

 # import <stdio.h> # import <objc/Object.h> @ protocol ProtocolA - (void) MethodA; @ end @ protocol ProtocolB - (void) MethodB; @ end @ protocol ProtocolC <ProtocolA> - (void) MethodC; @ end @ interface Test : Object <ProtocolB, ProtocolC> @ end @ implementation Test - (void) MethodA (printf ( "This is MethodA \ n");) - (void) MethodB (printf ( "This is MethodB \ n");) - (void) MethodC (printf ( "This is MethodC \ n");) @ end int main () ( id obj = [Test new]; [obj MethodA]; [obj MethodB]; [obj MethodC]; [obj free; return 0; )

이 프로그램의 ProtocolC 프로토콜 ProtocolA 프로토콜을 상속합니다.따라서 ProtocolC는 MethodA과 MethodC가 선언되어 

있다고 생각합니다.

또한 Test 클래스는 ProtocolB과 ProtocolC을 함께 이용하고있는 점에도 주목하십시오.선언 밖에 보유하지 않은 프로토콜 

메서드 이름이 충돌하면 해당 프로그램의 메서드 검색에는 영향이 없기 때문에 가능한 것입니다.그러나 다른 의도 메서드

가 프로토콜의 상속 관계에서 충돌하는 경우 주의해야 할 것입니다.




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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 22. 09:46
Hello, iPhone 프로그래밍 시작하기...(첫번째 스터디)
오프라인 스터디에서 매주 배운 것을 정리 및 공유하고자 이렇게 스터디 내용을 씁니다.

첫번째 시간은 피해갈 수 없는 Hello, World 입니다.. 전 Hello, iPhone으로 명명 하겠습니다.
스터디 목표는 다음과 같습니다.
- 뷰베이스의 프로젝트를 생성하여 헬로우 프로그램을 작성
- 윈도우베이스의 프로젝트를 생성하고 헬로우 프로그램 작성(xib, controller, delegate를 각각 입력)
- 두 프로젝트를 비교 분석하여 iPhone Cocoa모델의 전반적 흐름을 이해

1.Xcode를 실행 하면 Welcom to Xcode라는 화면의 프로젝트 선택 화면이 나타납니다.
자.. 이제 프로젝트를 생성해 봅시다. Create a new Xcode project를 선택합니다.



다음 화면은 프로젝트가 어떤 베이스로 Template을 생성하는가? 입니다.
좌측의 Application 선택하고  View-Base Appicaton을 선택합니다. 그리고 프로젝트명을 입력합니다.
전 HelloiPhone이라는 프로젝트명으로 생성을 완료~





자 생성된 주요 파일은 다음과 같습니다.
다음 파일은 기억해 두세요..
HelloiPhoneAppDelegate / HelloiPhoneViewController /HelloiPoneViewController.xib / MainWindow.xib



2. HelloiPhoneViewController.xib를 더블클릭하여 IB(Interface Builder)를 실행합니다
다음과 같이 View 윈도우에 라벨을 추가 후 텍스트를 입력합니다.

          

3. 여기서 주의 하실 것이 IB와 Xcode는 각각의 프로그램 입니다.
하나의 프로그램이 아니기 때문에 IB에서 저장을 해야 XCode의 xib파일에 반영이 됩니다.
cmd+s(저장)를 눌러주세요. 그리고 Xcode에서 Build & Run을 실행합니다.
위과 같이 에뮬레이터에서 Hello, iPhone을 보실 수 있습니다.

============================================================
윈도우 베이스의 Hello, iPhone 작성~
============================================================
1. 뉴 프로젝트 생성 시 Window-base Application을 선택 합니다. 저는 프로젝트명을 HelloiPhone2로 하였습니다.
보시는 것과 같이 프로젝트에 생성된 파일 중에 HelloiPhoneController,h/m 및 HelloiPhoneController.xib 파일이 생성되지 않습니다.
이번 프로젝트에서는 두파일 직접 추가,  IB 설정을 하겠습니다.




2. 우선 ViewController 클래스를 생성 해보겠습니다. cmd+n을 누르시거나 파일-뉴파일을 선택 합니다. 좌측 상단의 Cocoa Touch Class클릭 후 UIViewController를 선택하여 생성합니다.
여기서 주의 하실 점이 중간에 있는 옵션 체크 박스입니다. 만들 클래스가 UITableViewController SubClass가 아니기 때문에 언체크....또 With XIB for user interface.. 옵션도 언체크.. 이옵션은 클래스 생성시 해당 뷰클래스의 xib도 같이 생성하는 옵션인데 이번 스터디에서는 cocoa의 구조를 알기 위함이라 체크를 하지 않습니다... 조금뒤에 직접 xib 파일도 추가 하니..신경 쓰지 마시길..
저는 HelloiPhoneViewController라고 파일명을 주었습니다.



3. 생성된 클래스를 MainWindow와 연결하기 위해 HelloiPhone2AppDelegate.h 파일을 열어 다음을 추가 코딩 합니다.

/*HelloiPhone2AppDelegate.h*/
#import <UIKit/UIKit.h>
//생성된 클래스 선언 #import "HelloiPhoneViewController.h" 를 선언도 동일함
@class HelloiPhoneViewController;

@interface HelloiPhone2AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    //추가된 클래스의 객체를 선언
    HelloiPhoneViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
//객체생성(메모리 할당)
@property (nonatomic, retain) IBOutlet HelloiPhoneViewController *viewController;
@end

=====================
/*HelloiPhone2AppDelegate.m*/

#import "HelloiPhone2AppDelegate.h"
//헤더 부분에 import를 하지 않고 class 선언을 했을 경우 바디 파일에서 꼭 import 선언
#import "HelloiPhoneViewController.h"

@implementation HelloiPhone2AppDelegate

@synthesize window;
//get, set 사용을 위한 synthesize 선언
@synthesize viewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {   
    // Override point for customization after application launch
    // 메인윈도우에 view추가
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}
- (void)dealloc {
    [window release];
    //메모리 해제
    [viewController release];
    [super dealloc];
}
@end

4. HelloiPhoneViewController.xib 파일을 만들어 보겠습니다. cmd+n을 누릅니다.
새 파일 생성에서 좌측 User Interface 클릭 후 view xib를 선택 합니다.
xib 파일은 모두 생성이 완료 되었습니다.. 이제 xib와 생성한 controller 클래스간의 연결을 해봅시다.
먼저 MainWindow.xib를 연결해 보겠습니다. 처음 coontroller 클래스를 생성시 wiith xib for user interface 체크를 선택 하고 controller 클래스를 생성 하였다면 MainWindow.xib의 연결 설정을 할 필요는 없지만.. 이번에는 선택을 하지 않고 생성 하였기 때문에 우선 서로 연결을 해봅니다.
MainWindow.xib를 더블클릭으로 IB를 실행 시킵니다. 아래와 같이 Window.xib 창에는 어떠한 View Controller가 포함 되어 있지 않네요..



우선 Window 창에 View Controller를 추가 해보겠습니다. Library 에서 View Controller를 선택 합니다.
(노랑 바탕의 View입니다 흰바탕의  View와 혼동하지 마시길 바랍니다.) 드래그를 하여 File's Onewr/First Responder/... 등의 내용이 보이는 MainWindow.xib 윈도우 창에 View Controller를 놓습니다. 그럼 아래와 같이 하나의 View Controller 창이 새로 생성이 됩니다... 자 이제 연결을 해봅시다.



먼저 View Controller를 선택하고 Inspector(아래의 창입니다) 에서 cmd+1을 누릅니다. 그러면 속성 창으로 탭이 변경됩니다. (Inspector 창의 각 탭은  cmd+1..2..3..4로 탭창이 변경 가능 합니다.)
아래와 같이 nib name을 HelloiPhonViewController로 변경 합니다.



 그리고 cmd+4를 눌러 Identy Inspector 탭을 엽니다 4번째 탭... 여기서 Class를 HelloiPhoneViewController로 변경 합니다.



다음은 Hello iPhone2 AppDelegate를 선택하여 아래의 그림과 같이 연결을 합니다. Hello iPhone2 AppDelegate 의 연결이 완료 되면  HelloiPhoneController 에도 연결된 내용이 등록됩니다.





5. 자.. 마지막으로 HelloiPhoneViewController.xib 파일을 편집해보겠습니다..
먼저..HelloiPhoneViewController.xib를 더블클릭 해서 IB에 로드합니다.
View에 라벨을 올리고 Hello, iPhone 이라고 디자인을 합니다.
그리고 File's Owner를 클릭 Identy Inspector창을 띄웁니다(cmd+4) 그리고 class 를 HelloiPhoneViewController로 변경합니다.



그리고 File's Owner의 Connection을 연결합니다.



그러면 자동으로 View에도 Connection이 등록 됩니다.



자 이제 Build & Run 을 실행... 동일한 결과를 보실 수 있어요 ^^



수고 하셨습니다..  곰곰히 생각해보세요 흐름을...
중요한 것은 Connnection을 하기전 해당 클래스를 사용자가 추가한 클래스로 변경 한다는 것입니다. 
MainWindow의 경우는 nib name도 같이 변경을 해야 합니다..

잘되지 않을 경우 xcodenine@G메일.컴 으로 연락 주세요
ㅋㅋㅋ 자세히 설명 드릴께요...

정말 수고하셨어요 ^^ 다음 스터디 내용은
여러개의 뷰에 대한 스위칭 입니다. 시간이되면 툴바 및 텝바에 대해서도 진행 합니다.
다음 스터디에 뵙겠습니다.




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

댓글을 달아 주세요