[출처: http://maclove.pe.kr/32]

메모리 관리

많은 개발자들이 Objective-C 의 메모리 관리를 어렵게 느낀다. Objective-C 에서 객체는 참조 카운터를 이용해서 관리되기 때문에, 참조 카운터를 증가 시키고 감소하는 작업이 프로그래머의 몫이 된다. 여기서 혼돈이 오는 것이다. 참조 카운터를 증가시키는 함수는 retain 이다. 반대로 참조 카운터를 감소시키는 함수는 release와 autorelease 이다. 하지만 문제는 이미 만들어진 객체의 메서드가 내부에서 retain 을 몇번 부르는지를 별도로 알아낼 방법이 없다는 것이다. 다음을 보자.

UIImageView* imgView = [[UIImageView alloc] init];

이 코드에서 UIImageView 는 retain 내부에서 한번 호출해서 객체를 반환해 준다. 그렇기 때문에 우리는 더이상 필요하지 않을때,

[imgView release];

를 호출해야 한다. 하지만 다음을 보자.

NSString* output = [NSString stringWithFormat:@”My name : %@”, name];

이 코드는 NSString의 stringWithFormat 클래스 메서드를 이용해서 객체를 생성하는 코드이다. 이 녀석은 retain 이 아닌 autorelease 를 호출해서 객체를 반환한다. 이렇게 어떤 메서드는 객체를 retain 해서 반환하고, 또 어떤 객체는 autorelease 로 반환하기 때문에 혼돈이 온다.

참조 카운트를 관리하는 함수는 다음과 같다.

• retain
     - 참조 카운트를 1 증가 시킨다.
• release
     - 참조 카운트를 1 감소시킨다. 참조 카운트가 0이 되면 메모리가 해제된다.
• autorelease
     -  객체를 오토릴리즈 풀에 등록한다. 나중에 오토릴리즈 풀이 제거될때 release 를 호출해 준다.

객체의 참조를 관리하는 것은 위 3개의 메서드가 전부이지만, 문제는 클래스 내부 구현에서 위 함수들을 호출하는 지를 모른다는 점이다. 하지만 법칙이 있다. 애플이 작성한 모든 클래스는 정해진 규칙을 철저하게 따르기 때문에 이 법칙들만 알아두면 더 이상 햇갈릴 일이 없다.

* 규칙1 : alloc, copy, new를 이름에 포함하는 메서드는 retain 된 객체를 반환한다.

alloc, copy, new 가 메서드 이름에 포함되어 있다면, 그 때 반환되는 객체는 retain 되어 있다. 그래서 반드시 release 를 직접 호출해야 한다.

01: queue = [[NSOperationQueue alloc] init];
02: // 작업
03: [queue release];
04:
05: copyedObj = [name copy];
06: // 작업
07: [copyedObj release];

* 규칙2 : 결자해지

만약 자신이 retain 을 호출했다면, 책임지고 release 또는 autorelease 를 호출해 주자.

01: [objA retain];
02: // 작업
03: [objA release];

반드시 자신이 호출한 retain 에 대해서 release/autorelease 짝을 맞추도록 하자.

* 규칙3: 클래스 메서드가 객체를 생성해 줄때는 autorelease 객체를 반환한다.

클래스 메서드로 객체를 생성하는 경우 즉 stringWithFormat 과 같은 클래스 메서드가 반환하는 객체는 모두 autorelease 객체이다.

01: img = [UIImage imageNamed:@"test.png"];
02: imgView = [[UIImageView alloc] initWithImage:];
03: // 작업
04: [imgView release];

코드 1행의 imageNamed 메서드 처럼 클래스 메서드를 이용해서 객체를 생성하는 경우 그 객체는 autorelease 가 호출된 객체이다. 그렇기 때문에 별도로 release 를 호출하지 않아도 오토릴리즈 풀이 자동으로 release 를 호출해 준다. 하지만 이 객체에 retain 을 호출 했다면 호출한 만큼의 release 를 호출 해야한다.

* 규칙4: 포함 객체는 추가된 객체를 retain 하고, 항목을 제거할 때 release 한다.

NSArray,NSDictionay 등의 포함 객체는 항목으로 추가되는 객체에 대해서 retain 을 한번 호출한다. 그리고 객체가 포함객체에서 제거될때 release 를 호출해 준다.

13.9.5 규칙5: retain 속성을 갖는 접근자

프로퍼티를 구성할때 @property (retain) ... 과 같이 retain 속성을 지정하면 이 프로퍼티에 객체를 설정하면 retain 메서드를 호출한다.

01: myImage = [[UIImage alloc] init]; // myImage 에 retain –> 1
02: self.userImage = myImage; // myImage 에 retain –> 2
03: [myImage release]; // myImage 에 release –> 1
04: // ...
05: self.userImage = myImage2; // 예전 myImage 에 release -> 0 해제

이와 같이 객체를 설정하는 접근자는 일반적으로 그 객체에 대해서 retain 을 호출한다. 그리고 만약 다른 객체를 재설정하면, 예전 객체에 release 를 호출한다. 위 예제의 3행에서 release 를 호출한 이유를 이해할 것이다.

*규칙5: 메서드가 반환하는 객체는 autorelease

메서드가 객체를 반환한다면 autorelease 된 객체를 반환하는 것이 좋다.

01: -(NSString*) findTopPlayer {
02: NSString *ret = [[top objectAtIndex:0] copy];
03: [ret autorelease];
04: return ret;
05: }

[출처: http://maclove.pe.kr/32]



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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:22
iPhone SDK Tutorial 뷰를 모달로 띄우기
2010.01.25 월요일
오늘 종일 불안한 마음으로 서성인 하루에 한가지 남는 수확이라 여긴게 이거다.
"한개의 윈도우 그리고 여러개의 뷰"
이게 아이폰 개발의 원칙(?)쯤이라 말할 수 있다. 그래서 몇일전부터 고민고민하던게 뭐냐면,
 
 
만들어놓은 뷰를 프로젝트마다 써먹을 수 있는 방법이 뭘까

UIView 는 동적으로 생성될 수 있지만, 일일이 그려가면서까지 만들고 싶은 마음은 없다.
XIB 파일에 넣어진 UIView 를 불러다 쓰는 방법을 고민한 결과
재밌게도 이 방식을 유튜브에서 동영상 튜토리얼로 찾아낼 수 있었다.

방법은 
1. 뷰베이스 어플리케이션을 만든다. [뷰베이스, 즉 메인뷰는 존재한다는 거다]
2. 모달로 띄울 뷰를 만든다. [UIViewController 의 Subclass 로 만드는거다]
3. 메인뷰에서 세컨뷰를 띄워본다. 아래 코드로

#import "SecondView.h"
@implementation SwitcherViewController
-(IBAction)goToSecondView:(id)sender {
SecondView *secondView = [[SecondView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:secondView animated:YES];
}

4. 세컨뷰에서 메인뷰로 돌아가려면 아래 코드로

@implementation SecondView
-(IBAction)goBack:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}

너무너무 쉬워서 토할뻔 했다. 이걸 그렇게 찾아헤맸다니
유튜브 동영상 링크도 걸어놓자.
https://www.youtube.com/watch?v=coz6zaGEYSk




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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:22
iPhone SDK Tutorial 어플의 실행 순서

참 많이도 궁금했다. 실은 이런걸 먼저 습득한 후 개발에 들어가야 했었는데,

내가 알아낸건 앱이 최초 실행될 때의 과정에 대해서이다.

딜리게이트, XIB, 뷰, 뷰콘트롤러.. 그리고 이것들의 연결고리들.. 복잡해 보였기 때문에, 이 부분을 파는게 옳았다.

뷰에 관점을 두어야 한다.

뷰는 도화지다. 아니 화면이다. 사용자화면 말이다.

앱은 실행될 때 최초로 "화면에 뷰를 띄워야 한다" 는 것이다.

윈도우베이스로 프로젝트를 생성하고 실행시키게 되면 어떠한 뷰도 나타나지 않는다.

시뮬레이터에 보이는 것은 그냥 먹먹한 회색빛 화면이다.

따라서,

앱한테 최초에 어떤 뷰를 보여주어야 하는지 설정해줘야 한다. 이걸 어디서 하느냐면..

바로 딜리게이트에서 한다. 딜리게이트의 헤더에 뷰콘트롤러를 아웃렛으로 코딩해주고 구현부에서

해당 뷰콘트롤러가 가진 뷰를 윈도우의 뷰로 설정하라는 코드가 필요하다.

이하 헤더부

#import <UIKit/UIKit.h>

@interface SPWinBaseAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
UIViewController *viewContrller;
}

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

@end

이하 구현부

#import "SPWinBaseAppDelegate.h"

@implementation SPWinBaseAppDelegate

@synthesize window;
@synthesize viewContrller;

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

    // Override point for customization after application launch
[window addSubview:viewContrller.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [window release];
    [viewContrller release];
    [super dealloc];
}
@end

그리고 인터페이스 빌더에서 MainWindow.XIB 를 열고 라이브러리로부터 뷰콘트롤러를 드래그 하여 추가한다.

이제 위에서 코딩한 뷰콘트롤러 아웃렛이 바로 이녀석임을 설정!! (난 사실 이 부분이 너무 알고 싶었던 거다. 후후)


자, 이제 끝인가? 아니다.

뷰콘트롤러를 딜리게이트에 연결해줬고, 델리게이트의 런치피니쉬 메소드에서 메인윈도우의 뷰로 설정도 해줬지만

정작 뷰콘트롤러는 아무런 뷰도 가지고 있지 않다.

라이브러리를 통해서 뷰콘트롤러에 "뷰" 콘트롤을 추가해주고 실제 UI 작업은 그곳에서 해야 한다.

뷰를 올려놓으면 위 그림처럼 뷰콘트롤이 뷰콘트롤러의 하위 콘트롤로 생성이 되며, 그곳에 아무 라벨이나 올려놓고 실행해보자.




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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:22
iPhone SDK Tutorial 데이터 읽고 쓰기
파일을 읽고 쓰기...?
어떤 프로그래밍에서든 빠질 수 없는 부분이다.

예상대로 XML 형태의 데이터값들을 저장하고 읽는 방식으로 제공되고 있다.
바이너리라면 Base64 인코딩해서 XML 에 넣어야 할걸 ^^;;
일단 파일의 경로를 구하는 방법이다.
이걸 절대경로를 이용하는 방법은 절대 비추이다. 샌드박스의 절대경로를 알 수도 없을 것이다.
백북에서 시뮬레이터로 작업할 때 생기는 경로는 
/Users/nshc/Library/Application Support/iPhone Simulator/User/Applications 이다.

- (NSString *)dataFilepath {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

return [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

}


위 메소드를 통해서 파일 경로를 구하거나 지정하고 ^^;;; 아래 메소드는 읽는 부분이 되겠다.


- (void)viewDidLoad {

NSString *filePath = [self dataFilepath];

if ([[NSFileManagerdefaultManager] fileExistsAtPath:filePath]) {

NSArray *array = [[NSArrayalloc] initWithContentsOfFile:filePath];

//NSLog(@"파일값: %@", [array objectAtIndex:0]);

[array release];

} else {

//NSLog(@"파일없음 data.plist");

}

    [superviewDidLoad];

}


보면 알겠지만 array 를 이용하고 있는데 이 array 라는 녀석이 만능이다.

맥환경에서의 설정파일은 XML 형태를 이용하는 plist 파일이 일반적인데, 이 파일을 array 형태로 읽고 쓰기가 가능하다.

쓰기는 어떻게 할까?


- (void)saveData:(NSString *)pValue {

NSMutableArray *array = [[NSMutableArrayalloc] init];

[array addObject:pValue];

[array writeToFile:[self dataFilepath] atomically:YES];

[array release];

//NSLog(@"파일저장완료");

}


어때? 이 심플함이 매력이다. array 가 writeToFile 메소드를 제공하고 있다규~ 오예~!!

실은 이 파일의 내용은 어플이 마지막으로 실행된 정보를 저장하거나 읽기 위해 기록한 데이터인데..


마지막으로..

array 객체가 아닌 키-밸류 형태의 데이터 저장과 읽기 방법은 NSDictionary 객체를 이용하는데 방법은 아래와 같다.

- (void)readPlist
{
    NSString *filePath = @"/System/Library/CoreServices/SystemVersion.plist";
        NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

        NSString *value;
        value = [plistDict objectForKey:@"ProductVersion"];
}

위에께 읽기 메소드고 쓰기는

- (void)writeToPlist
{
    NSString *filePath = @"/System/Library/CoreServices/SystemVersion.plist";
        NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

        [plistDict setValue:@"1.1.1" forKey:@"ProductVersion"];
        [plistDict writeToFile:filePath atomically: YES];

}



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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:22
iPhone SDK 변수가 되는 메소드 (함수포인터)

Obj-C 를 한참 파고 있는 요즘.

내가 델파이로 자주 쓰던 패턴인 싱글톤과 약식옵저버를 구현할 수 있을까 고민했다. 싱글톤은 간단했다.

구현부에

static KNLocationManager *instance = nil;

@implementation KNLocationManager

+ (KNLocationManager *)sharedInstance {
 if (instance == nil) {
  instance = [[KNLocationManager alloc] init];
 }
 return instance;
}


참고로 아래껀 초기화 오버라이드

- (id)init {
    if ((self = [super init]) == nil)
        return nil;

    // 여기서 초기화하고..
    return self;
}


불러서 쓸때는 요렇게

- (void)viewDidLoad {
 KNLocationManager *knLocationManager = [KNLocationManager sharedInstance];

음.. 그래 싱글톤이야 뭐.. 그런데 메소드를 등록해놓고 나중에 특별한 이벤트가 발생했을 때 이 녀석을 실행시켜달라고 할 수는..?

콜백함수를 등록시키는 방법을 구현하고 싶었다.


Obj-C 에서는 메소드형을 SEL 이라는 지시자를 이용한다. 그러니까


@interface MyClass : NSObject {

id callBackTarget;

SEL callBackMethod;


이런식으로 선언할 수 있다는거다.

id 는 어떤 객체라도 받을 수 있는 객체형 와일드카드다 ^^;;

그리고 이 클래스를 사용하는 쪽에서 콜백함수를 등록시킬 수 있는 채널을 제공해야지?

MyClass에서 아래와 같은 메소드를 제공한다고 치자.


-(void)startPlus:(id)pCallBackTarget selector:(SEL)pCallBackMethod {

callBackTarget = pCallBackTarget;

callBackMethod = pCallBackMethod;


인자로 들어온 값들을 미리 선언해두었던 변수에 각각 저장해둔다.

왜냐하면 언젠가 특별한 일(?)이 생길때 저걸 이용해서 온파이어~ 를 해줘야 하니까.


자, 이제 MyClass에 온파이어를 하는 함수를 만들어보면..


- (void)fire {

IMP funcp;

funcp = [callBackTargetmethodForSelector:callBackMethod];

(*funcp)(callBackTarget, callBackMethod, 5);

}


5 는 뭘까? 파라메터 값을 테스트해본거다. MyClass 에 등록할 콜백함수의 원형을 보면


- (void)testCallback:(NSInteger)pParam1 {

NSLog(@"Callback function exected! %d", pParam1);

}


MyClass 로부터 값을 받고 있다. 파라메터값으로 말이지,

마지막으로 콜백함수를 등록하는 부분을 보고 끝내자


MyClass *myobj = [MyClasssharedInstance];

[myobj startPlus:selfselector:@selector(testCallback:)];


여기서 중요한 부분이 @selector 의 인자로 들어가는 콜러의 콜백함수 뒤에 콜론이다. ^^;;;

즉, 파라메터가 1개 있다는 뜻이다.



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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:20
무료 아이폰 SDK 동영상 강좌
1강 iPhone SDK 강좌를 들어가면서~~


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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:13
Beginning iPhone Development: Exploring the iPhone SDK

CH2. Appeasing the Tiki Gods


In each Nib file (File’s Owner and First Responder), every icon in this window represents a single instance of an  Objective‑ C class that will be created automatically for you when this nib file is loaded. 


File’s Owner: represents the object that loaded the nib file from disk

First Responder: the object with which the user is currently interacting. The first responder changes as the user interacts with the interface.


AppKit (Mac OS X) --- UIKit (iPhone OS)


CH3. Handling Basic Interaction


MVC model - Any object you write should be readily identifiable as belonging in one of the three categories for maximum reusability.


outlet: (IBOutlet) a pointer that points to an object within the nib

IBOutlet keyword in the header files allows IB to make connections from your code to the nib.


action: (IBAction) part of controller class. 


class methods: factory methods, returns an autoreleased object


“if you didn’t allocate it or retain it, don’t release it”


UIViewController --- corresponding nib file

MainWindow.xib --- in Info.plist -- ApplicationDelegate


Your controller class is the file’s owner for the nib file of the same name.


** connecting outlets **

By  control‑ dragging from File’s Owner to an interface object, you are telling Interface Builder that you want to connect one of the File’s Owner’s outlets to this object when the nib file is loaded.


** specifying actions **

The only thing left to do is to identify which actions these buttons trigger and under what circumstances they trigger them.


 Up Inside.  In most of your iPhone applications if you touch the screen and change your mind. You move your finger off the button before lifting up, right? We should give our users the same ability. If our user’s finger is still on the button when it’s lifted off the screen, then we can safely assume that the button tap is intended.


Ch4. More User Interface Fun


* Controls can be used in many ways.

- active: button, ...

- static: label, ...

- passive: e.g., text field, ...


The way to access the data held by a passive control is to use an outlet.


If you want to display the same image at multiple sizes, generally it’s better to have multiple copies of the image at different sizes in your project rather than force the iPhone to do scaling at runtime.


Tags provide an easy,  language-independent way of identifying objects on your interface. The system will never set or change its value.


Opaque: nothing below this view ever needs to be drawn no matter what.

Clip Subviews: is off by default for the sake of performance


When the user taps the Done button, a “did end on exit” event will be generated.

First responder is the control that the user is currently interacting with. When a text field yields first responder status, the keyboard associated with it goes away.


action sheet - <UIActionSheetDelegate>

All action sheets should have a cancel button.

In situations where you want to notify the user without giving a choice of options, an alert sheet (alert view?) is more appropriate.

Action sheets always have a parent, which must be a view that is currently visible to the user. .


* 4 states of a control

- normal: rest of the other three

- highlighted: when it is being used

- disabled

- selected


Ch5. Autorotation and Autosizing


* tackling autorotation

- autosizing

- manually reposition each object

- different view versions for each rotation


* 4 possible roation

- UIInterfaceOrientationPortrait 

- UIInterfaceOrientationPortraitUpsideDown 

- UIInterfaceOrientationLandscapeLeft 

- UIInterfaceOrientationLandscapeRight 


Because every view controller subclass can implement this differently, it is  possible for one application to support autorotation with some of its views but not with others.


Transformations are mathematical descriptions of changes to an object’s size, position, or angle.


Ch6. Multiview Applications


UITabBarController and UINavigationController are subclasses of UIViewController and can do anything other view controllers can do.


A content view is created indirectly by instantiating its controller class and specifying a nib name. Nibs are typically named using the same name as the controller class.


The root controller gets created when the application loads MainWindow.xib.


The window is the only gateway to the user, so anything that needs to be displayed to the user has to get added as a window subview.


Lazy Loading: do not load resources in the viewDidLoad: method until they are actually needed. ** Loading resources on-demand allows us to freely deallocating those resources when low memory situation occurs. **


** When we changed the underlying class of the file’s owner, the existing outlet connections were broken.  **


**Animation Example**


[UIView beginAnimations:@"View Flip" context:nil]; 

[UIView setAnimationDuration:1.25]; 

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

[UIView setAnimationTransition: transition forView:self.view cache:YES]; 

[coming viewWillAppear:YES]; //#1

[going viewWillDisappear:YES]; //#1

[going.view removeFromSuperview]; 

[self.view insertSubview: coming.view atIndex:0]; 

[going viewDidDisappear:YES]; //#1

[coming viewDidAppear:YES]; //#1

[UIView commitAnimations]; 


#1: Views that have running animations on them, for example, will often choose to turn those animations off when their view is swapped out and turn them back on when they are swapped back in.


Ch7. Tab Bars and Pickers


The picker asks the delegate for either a string or a view that will be drawn at a given spot on a given component.

Picker datasource methods are used by the picker to get the number of components and the number of rows in each component. The datasource isn’t usually an object designed to hold data; it’s an object that supplies data to the picker.


Tab Bar icons - 24x24 pixels in .png format


* Using Interface Builder

1. Declare var.s in Header file

2. Draw controls and set up the classes and properties

3. Implement the Method file


We use NSInteger rather than int or long, because when we use NSInteger, the compiler automatically chooses whichever size is best for the platform for which we are compiling.


Putting in #pragma mark directives and logically organizing your code will make that  pop- up more efficient to use.


bundle is just a special type of folder whose contents follow a specific structure. Applications and frameworks are both bundles.


** fonts on iPhone **

American TypewriterAppleGothicArialArial Rounded MT BoldArial Unicode MS,CourierCourier New, DB LCD Temp, Georgia, Helvetica, Helvetica NeueHiragino Kaku Gothic ProN W3Hiragino Kaku Gothic ProN W6Marker FeltSTHeiti JSTHeiti KSTHeiti SCSTHeiti TCTimes New RomanTrebuchet MSVerdanaZapfino


** convenience class methods use the autorelease pool.


NSString *path = [[NSBundle mainBundle] pathForResource:@"crunch" ofType:@"wav"]; 

SystemSoundID soundID; 

AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &soundID); 

AudioServicesPlaySystemSound(soundID);


Ch8. Introduction to Table Views

A table view is the object that displays the visible part of a table, and a table view cell is responsible for displaying a single row of the table.


Table views get their configuration data from an object that conforms to the UITableViewDelegate protocol and their row data from an object that conforms to the UITableViewDataSource protocol.


* 2 methods that implement the UITableViewCell

- add subviews to UITableViewCell

- subclass UITableViewCell


* 2 types of table view

- grouped table

- indexed (with or without index)


section: group in a table


Mutable copy: shallow copy


It is not safe to remove objects from a collection while iterating that collection.


It’s very important to avoid using convenience methods inside of loops as much as possible, because they will put something into the autorelease pool every time through the loop. However, the autorelease pool can’t get flushed until we’re all done with our loop.


Ch9. Navigation Controllers and Table Views


UINavigationController is implemented as a stack

disclosure indicator vs. detail disclosure control


If tapping a row takes you to another view entirely, one that is not a more detailed view of that row, use a disclosure indicator (gray arrow) to mark the row. 


** 6 styles of cell **

+ Detail Disclosure button

// showing disclosure button

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath 

    return UITableViewCellAccessoryDetailDisclosureButton; 

}

// responding disclosure detail button

- (void)tableView:(UITableView *)tableView 

accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 


+ Checked

newCell.accessoryType = UITableViewCellAccessoryCheckmark;


+ Adding Controls

// add control to the accessory pane

UISwitch *switchControl = [[UISwitch alloc] init];

switchControl.tag = kSwitchTag;

cell.accessoryView = switchControl;


// read value

UISwitch *switchControl = [cell viewWithTag:kSwitchTag];


+ Editing mode

setEditing:animated: method on the table view.


reordering for cell

cell.showsReorderControl = YES;


+ Delete mode

The delete and reorder operations do play nicely together.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath


We can’t store raw datatypes like int in an NSDictionary.


Ch10. Application Settings and User Defaults


NSUserDefaults class

There can only be one root node in any given property  list, and all nodes must come under it.

Although you can use any kind of object as a key in an NSDictionary, keys in property list dictionary nodes have to be strings, though you are free to use any node type for the values.


Sliders allow placement of a small  21- pixel   21- pixel image at each end of the slider.


* Type *

PSGroupSpecifier

PSTextFieldSpecifier

PSTextFieldSpecifier

PSMultiValueSpecifier

PSToggleSwitchSpecifier

PSSliderSpecifier

PSChildPaneSpecifier


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

objectForKey:, intForKey:, floatForKey: boolForKey:


Ch11. Basic Data Persistence


NSSearchPathForDirectoriesInDomain function


* Document directory *

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDirectory = [paths objectAtIndex:0];

// each application has only one Documents directory.

NSString *filename = [documentsDirectory  stringByAppendingPathComponent:@"/theFile.txt"];


* Temporary directory *

NSString *tp = NSTemporaryDirectory();


The downside of using a single file is that you have to load all of your application’s data into memory, and you have to write all of it to the file system for even the smallest changes.


** Property list serialization

Although any object can be made serializable, only certain objects can be placed into a collection class, such as an NSDictionary or NSArray, and then stored to a property list using the collection classes’ writeToFile:atomically: method. 

- NSArray

- NSMutableArray

- NSDictionary

- NSMutableDictionary

- NSData

- NSMutableData

- NSString

- NSMutableString

- NSNumber

- NSDate


[myArray writeToFile:@"/some/file/location/output.plist" atomically:YES];


** Archiving model object

* NSCoding protocol *

You can encode and decode both objects and scalars using  key- value coding.

- (void)encodeWithCoder:(NSCoder *)encoder

- (id)initWithCoder:(NSCoder *)decoder

// if your superclass doesn't conform to NSCoding

   if (self = [super init])

// if your superclass conforms to NSCoding

   if (self = [super initWithCoder:decoder])


* NSCopying protocol *

- (id)copyWithZone:(NSZone *)zone

{

    MyClass *copy = [[[self class] allocWithZone: zone] init];

    copy.foo = [self.foo copy];

   ...

    return copy;// caller releases copy

}


* Archiving Data object *

NSMutableData *data = [[NSMutableData alloc] init];

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

[archiver encodeObject:myObject forKey:@"keyValueString"];

[archiver finishEncoding];

BOOL success = [data writeToFile:@"/path/to/archive" atomically:YES];

[archiver release];

[data release];

* Unarchiving Data object *

NSData *data = [[NSData alloc] initWithContentsOfFile:path];

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

self.object = [unarchiver decodeObjectForKey:@"keyValueString"]; // auto-released

[unarchiver finishDecoding];

[unarchiver release];

[data release];


** SQLite3

 object- relational mapping (ORM) is provided by Core Data

// open

sqlite3 *database;

int result = sqlite3_open("/path/to/database/file", &database);

// close

sqlite3_close(database);

// execution

char * errorMsg;

const char *createSQL = "CREATE TABLE IF NOT EXISTS PEOPLE

 (ID INTEGER PRIMARY KEY AUTOINCREMENT, FIELD_DATA TEXT)";

int result = sqlite3_exec (database, createSQL, NULL, NULL, &errorMsg);

// retrieval

NSString *query = @"SELECT ID, FIELD_DATA FROM FIELDS ORDER BY ROW";

sqlite3_stmt *statement;

int result = sqlite3_prepare_v2( database, [query UTF8String],-1, &statement, nil);

while (sqlite3_step(statement) == SQLITE_ROW) {

    int rowNum = sqlite3_column_int(statement, 0);

    char *rowData = (char *)sqlite3_column_text(statement, 1);

    NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];

    // Do something with the data here

    [fieldValue release];

}

sqlite3_finalize(statement);


Ch12. Drawing with Quartz and OpenGL


* Quartz 2D: painter's model on a virtual canvas with invisible pen (context)

* OpenGL ES: state machine, virtual window into its 3D world


** Quartz 2D **

Core Graphics’s API is C based.


// retrieves the current context

CGContextRef context = UIGraphicsGetCurrentContext();


CGPoint(x, y)

CGSize(width, height)

CGRect(CGPoint origin, CGSize size)


Color: (Red, Green, Blue) * alpha

[UIColor colorWithRed:1.0f green:0.0f blue:0.0f alpha:1.0f]


Draw images directly into a context:

CGImage or UIImage (ObjC alternative)


when an object instance is loaded from a nib, neither init: or initWithFrame: ever gets called. Instead, initWithCoder: is used.


setNeedsDisplay:  vs. setNeedsDisplayInRect:


We need to redraw not just the rectangle between firstTouch and lastTouch but any part of the screen encompassed by the current drag.


** OpenGLES **

http://www.khronos.org/opengles/


OpenGL ES doesn’t have sprites or images, per se; it has textures. draw a polygon, and then map a texture onto that polygon


[1] you draw in the context.

[2] once all your drawing is done, you render the context into the buffer.

[3] you present your render buffer, which is when the pixels actually get drawn onto the screen.


Ch13. Taps, Touches, and Gestures


160 pixels per inch


gesture is any sequence of events that happens from the time you touch the screen with one or more fingers until you lift your fingers off the screen.


iPhone only keeps track of tapswhen one finger is used.


The first responder is almost always a view or control and gets the first shot at responding to an event.


responder chain: view -> view's view controller -> view's parent view -> view's parent's view controller -> ...

If an object intercepts an event that it doesn’t handle, it needs to pass it along manually, by calling the same method on the next responder.


Every object in touches is a UITouch event that represents one finger touching the screen.

Every UITouch object knows its current position in the view, as well as its previous position in the view.


Ch14. Core Location


CLLocationManager *locationManager = [[CLLocationManager alloc] init];


Our delegate must conform to the CLLocationManagerDelegate protocol.


// self conforms to CLLocationManagerDelegate protocol

locationManager.delegate = self;

locationManager.desiredAccuracy = kCLLocationAccuracyBest;

locationManager.distanceFilter = 1000.0f;

// start continuously polling the location

[locationManager startUpdatingLocation];


The accuracy value is in meters, so if you specify a desiredAccuracy of 10, you’re telling Core Location that you want it to try to determine the current location within 10 meters, if possible.

Distance filters are also set in meters.


Ch15. Accelerometer

(+x: right, +y: up, +z: front)


Accelerometers give measurements in  g- forces (“g” for gravity), so a value of 1.0 returned by the accelerometer means that 1 g is sensed in a particular direction.


 // singleton

UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];

accelerometer.delegate = self;          // UIAccelerometerDelegate protocol

accelerometer.updateInterval =  1.0f/60.0f;


accelerometer:didAccelerate:           // delegate method

UIAcceleration object                      // passed object for acceleration data


** detect shaking (1.5g ~ 2g, max: 2.3g)

- (void)accelerometer:(UIAccelerometer *)accelerometer 

    didAccelerate:(UIAcceleration *)acceleration {

    

    if (fabsf(acceleration.x) > 2.0  

        || fabsf(acceleration.y) > 2.0 

        || fabsf(acceleration.z) > 2.0) {

        // Do something here...

    }

}


If you’re doing animation based on input from the accelerometer, you have to keep track of the time that passes between delegate method calls.


When using the accelerometer as a controller, you’ll need to poll at a considerably faster rate, usually between 30 and 60 updates per second.


Ch16. Camera and Photo Library

UIImagePickerController

1. create an instance of this class

2. specify a delegate

3. specify its image source

4. launch it modally


[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]


UIImagePickerController *picker = [[UIImagePickerController alloc] init];

picker.delegate = self;                // UIImagePickerControllerDelegate protocol

picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

[self presentModalViewController:picker animated:YES];

[picker release];


UIImagePickerController is a subclass of UINavigationController, we have to conform our class to both of these protocols.


Ch17. Application Localization

<2 or 3 language code (lower case)>_<2 letter country code (upper case)>.lproj


Full name localization project, such as French.lprj. exists to support legacy Mac OS X applications, and you should avoid it.


* resouce searching order

1. language_country matching resource

2. language matching resource

3. base language resource


* string files *

/* comments */ 

"First Name" = "First Name"; 

-----

NSString *myString = @"First Name";

NSString *myString = NSLocalizedString(@"First Name", 

    @"Used to ask the user his/her first name");


genstrings ./Classes/*.m

import (not copy) Localizable.strings as UTF-16 char. set file.



출처 : http://blog.naver.com/PostView.nhn?blogId=gonagi&logNo=150051830428
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. 21. 22:48
[iPhone] iPhone SDK 다운로드
 
 

현재 http://developer.apple.com/iphone/ 에서는 아이폰 SDK 3.2 만 다운로드 받을 수 있게 되어 있습니다. 아이폰 SDK 3.2 는 OSX 10.6.2 버전 이상에서만 설치되더군요. 그래서, 하위 버전의 아이폰 SDK 가 필요해서 구글 검색하다가 아래의 링크 리스트를 발견하게 되었어요.

해당 SDK 를 다운로드 받고 싶으신 분은 아래의 경로 링크에서 오른쪽 마우스 버튼을 클릭하신 후, "다른 이름으로 대상 저장" 메뉴를 클릭하시면 다운로드되어서 저장될 파일을 선택하고 다운로드 받으시면 됩니다.

iPhone SDK 2.2.1 direct download link
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_for_iphone_os_2.2.1__9m2621a__final/iphone_sdk_for_iphone_os_2.2.19m2621afinal.dmg

iPhone SDK 2.2 direct download link
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_for_iphone_os_2.2__9m2621__final/iphone_sdk_for_iphone_os_2.2_9m2621_final.dmg

iPhone SDK 3.0 (Xcode 3.1.3) Leopard direct download link
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.0__final/iphone_sdk_3.0__leopard__9m2736__final.dmg

iPhone SDK 3.0 (Xcode 3.2) Snow Leopard direct download link
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.0__final/iphone_sdk_3.0__snow_leopard__final.dmg

iPhone SDK 3.1 with Xcode 3.1.4 Leopard direct download link
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.1__final/iphone_sdk_3.1_with_xcode_3.1_final__leopard__9m2809.dmg

iPhone SDK 3.1 with XCode 3.2.1 for Snow Leopard
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.1__final/iphone_sdk_3.1_with_xcode_3.2_final__snow_leopard__10a432.dmg

iPhone SDK 3.1.2 with XCode 3.1.4 for Leopard
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.1.2__final/iphone_sdk_3.1.2_with_xcode_3.1.4__leopard__9m2809.dmg

iPhone SDK 3.1.2 with XCode 3.2.1 for Snow Leopard
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.1.2__final/iphone_sdk_3.1.2_with_xcode_3.2.1__snow_leopard__10m2003.dmg

iPhone SDK 3.1.3 with XCode 3.1.4 for Leopard
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.1.3__final/iphone_sdk_3.1.3_with_xcode_3.1.4__leopard__9m2809a.dmg

iPhone SDK 3.1.3 with XCode 3.2.1 for Snow Leopard
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.1.3__final/iphone_sdk_3.1.3_with_xcode_3.2.1__snow_leopard__10m2003a.dmg

iPhone SDK 3.2 beta 4 with Xcode 3.2.2 (Snow Leopard)
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.2_beta_4/iphone_sdk_3.2_beta_4_with_xcode_3.2.2.dmg

iPhone SDK 3.2 with Xcode 3.2.2 (Snow Leopard)
http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_3.2__final/xcode_3.2.2_and_iphone_sdk_3.2_final.dmg


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

댓글을 달아 주세요