실전 프로젝트 1 - Abstract Clock            Source   http://dl.dropbox.com/u/3967678/iCan/1_AbstractClock.zip 

                                                         Appstore http://itunes.apple.com/us/app/abstract-clock/id370522968?mt=8



실전 프로젝트 2 - Beauty of Korea          Source   http://dl.dropbox.com/u/3967678/iCan/2_BeautyOfKorea.zip 

                                                         Appstore http://itunes.apple.com/us/app/beauty-of-korea/id386960426?mt=8



실전 프로젝트 3 - Memo Pad                 Source   http://dl.dropbox.com/u/3967678/iCan/3_1_MemoPad-AppleGUI.zip 

                                                                      http://dl.dropbox.com/u/3967678/iCan/3_2_MemoPad-CustomGUI.zip



실전 프로젝트 4 - Simple Twit                Source   http://dl.dropbox.com/u/3967678/iCan/4_SimpleTwit.zip 



실전 프로젝트 5 - Simple 4sq                 Source   http://dl.dropbox.com/u/3967678/iCan/5_Simple4sq.zip 



실전 프로젝트 6 - Wisps                        Source   http://dl.dropbox.com/u/3967678/iCan/6_Wisps.zip 



실전 프로젝트 7 - Beauty of Korea HD     Source   http://dl.dropbox.com/u/3967678/iCan/7_BeautyOfKoreaHD.zip 

                                                         Appstore http://itunes.apple.com/us/app/beauty-of-korea-hd/id387205893?mt=8

[출처] 소스코드 내려받는 링크|작성자 iCAN

[출처 : http://www.luuvish.org/208]

VLC는 한번에 제대로 컴파일된 적이 없네요. iOS 버전은 최근에 작업중인지 그나마 덜 고생하고 컴파일 성공했습니다. 프로젝트들이 얽혀있어 분석이 쉽진 않겠네요.

$ tar jxvf VLC-1.1.0-iOS.tar.bz2
$ ln -s VLC-1.1.0-iOS vlc
$ cd vlc/extras/package/ios
  • build_for_iOS.sh 을 열어서 SDK 버전을 수정합니다. 현재 최신버전은 4.2.sdk입니다. IOS_SDK_ROOT="${DEVROOT}/SDKs/iPhone${PLATFORM}3.2.sdk"
  • build_for_iOS.sh 를 실행해서 컴파일해 보면 중간에 에러가 나면서 멈춥니다. patch file의 버전문제인데 ../../contrib/src-arm-apple-darwin10-ios/src/Patches/live-inet_ntop.patch의 161-185 라인을 참고해서 ../../contrib/src-arm-apple-darwin10-ios/src/live/liveMedia/RTSPServer.cpp을 직접 수정하면 됩니다. our_inet_ntoa()의 두번째 인자로 buf를 추가하기만 하면됩니다.
  • 이제 build_for_iOS.sh를 실행해서 컴파일합니다. 완료되면 vlc/install-ios-OS에 해더와 라이브러리가 생성됩니다.
  • MobileVLCKit의 static plugins를 build합니다.
$ cd vlc/projects/macosx/framework
$ xcodebuild -project MobileVLCKit.xcodeproj -target "Aggregate static plugins" -configuration "Release"
  • MobileVLCKit의 MobileVLCKit의 SDK 버전을 최신버전으로 수정하고 build합니다.
$ open MobileVLCKit.xcodeproj
fix Targets/MobileVLCKit - Get Info / Build
Configuration : All Configurations
Architectures / Base SDK : Latest iOS
$ xcodebuild -project MobileVLCKit.xcodeproj -target "MobileVLCKit" -configuration "Release"



MediaLibraryKit compile하기
  • 작업디렉토리(VLC-1.1.0-iOS와 같은 위치)에 MediaLibraryKit 디렉토리를 만들고 압축을 풉니다.
$ mkdir MediaLibraryKit && cd MediaLibraryKit
$ unzip MediaLibraryKit-1.1.0.zip
  • External 디렉토리로 들어가 MobileVLCKit의 링크를 만듭니다.
$ ln -s ../../vlc/projects/macosx/framework/build/Release-iphoneos MobileVLCKit
  • MediaLibraryKit의 SDK 버전을 최신버전으로 수정하고 build합니다.
$ open MobileMediaLibraryKit.xcodeproj
fix Targets/MobileMediaLibraryKit - Get Info / Build
Configuration : All Configurations
Architectures / Base SDK : Latest iOS
$ xcodebuild -project MobileMediaLibraryKit.xcodeproj -configuration "Release"



MobileVLC compile하기
  • 작업디렉토리(VLC-1.1.0-iOS와 같은 위치)에서 MobileVLC의 압축을 풉니다.
$ tar zxvf MobileVLC-1.1.0.tar.gz
$ cd MobileVLC
  • External 밑에 있는 MediaLibraryKit와 MobileVLCKit의 링크가 제대로 되어있는지 확인합니다.
  • MobileVLC의 SDK 버전을 최신버전으로 수정하고 build합니다.
$ open MobileVLC.xcodeproj
fix Targets/MobileVLC - Get Info / Build
Configuration : All Configurations
Architectures / Architectures : Standard (armv6 armv7)
Architectures / Base SDK : Latest iOS
build with Device-Release configurations


NSHost 는 Private API로 앱등록시 사용을 할 수가 없다.

개발하고 앱에 등록을 못한다니... 왜 이런 함수를 만들어 놓았을까?

http://stackoverflow.com/questions/3434192/alternatives-to-nshost-in-iphone-app

앱스토어 등록을 처음 해보는데 생각보다 어려웠다.

Clean - Build - Archive를 Xcode에서 하고,
Organizer - Archives에서 Validate만 100번은 한 것 같다.

나중에 잊을 것 같아 적어놓으려 한다.

1. 키체인 생성, 애플웹사이트에 올리고, 다운받아서 실행한다.
2. 애플웹사이트에서 Provisioning Profiles을 만들어가 Organizer - Devices에 Imports한다.
3. Xcode에서 Release를 복사해 Distribution을 만들어서 해주어야 한다.
4. Xcode에서 code signing identity를 iPhone Distribution으로 한다.

기타 다른 블로그나 사이트 참고로 code signing 에러를 해결한다.

다음 문제는 코드에 warning중에 Class method ... not found 라는 것이 있으면 앱스토어에 올릴 수 없다.
public API가 아니라 private이라는 것인데 개발할때는 잘 되다가 올릴때만 안된다니 참 이해 못할 노릇이다.
하여간 이것을 다른 함수로 대체해서 다시 만들어야 올릴 수 있다. 

[출처] http://rootnode.tistory.com/114
 

UIImage --> CGImageRef

CGImageCreateWithImageInRect 함수 사용

CGImageRef --> UIImage
UIImage 클래스의 
+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage 메쏘드 사용

ex)


CGImageRef --> CGContextRef
http://www.drobnik.com/touch/2010/07/drawing-on-uiimages/를 참고한다.
CGContextRef newBitmapContextSuitableForSize(CGSize size)
- (UIImage *)imageByDrawingCircleOnImageCG:(UIImage *)image
를 보면 된다.

CGContextRef --> GImageRef
CGImageRef cgImage = CGBitmapContextCreateImage(ctx); //ctx가 CGContextRef type의 변수

CGImageRef --> pixel data
http://developer.apple.com/mac/library/qa/qa2007/qa1509.html
http://stackoverflow.com/questions/448125/how-to-get-pixel-data-from-a-uiimage-cocoa-touch-or-cgimage-core-graphics
http://stackoverflow.com/questions/144250/how-to-get-the-rgb-values-for-a-pixel-on-an-image-on-the-iphone
요약하면,
CGContextRef를 먼저 만들고, 컨텍스트에 이미지를 그린 다음, 거기에서 pixel Data를 뽑아내야 한다.


Objective-C
[연산자 제어문]
* C, C++ : include
  Objective-C : #import <stdio.h>  여러번 나와도 한번만 import 됨
* Data Type
 - int(4), char(1), float(4), double(8)
 - Id : 객체 포인터 주소 저장 데이터 타입, 어떤 객체라도 저장가능
 - SEL : C언어의 함수 포인터, @selector의 값을 저장할 수 있는 데이터 타입
 
 
* Windows에서 개발 할때 Dev-C++ 툴 사용

* system("PAUSE"); //잠시 정지하기
 
[클래스]
* 클래스내 변수 : 멤버 변수 -> 인스턴스 변수 (Objective-C)
* 클래스내 함수 : 멤버 함수 -> 메서드 (Objective-C)
* @Interface : 메서드, 인스턴스 변수 선언, 상속 선언
  @implementation : 메서드의 기능 구현
  Main : @implementation의 메서드 실행
 
* -(void) print;
  -(void) setValue1:(int)d; //인자값을 넣지 않는다. 하나의 인자
  -(void) setValue1:(int)d Value2:(int)f; //첫번째는 인자값을 넣지 않는다.
  - : 인스턴스 메서드
  + : 클래스 메서드 : 객체생성과 관계없이 호출가능 static
  () : 리턴형
 
* 메서드 호출
  A.func() -> [A func]
 
  [] : 메서드 호출
 
* 포인트 변수 생성
  Calculate *myCalculate;
 
  객체 초기화
  myCalculate = [Calculate alloc];
  myCalculate = [myCalculate init];
 
 
  //인자있는 메서드 호출
  [myCalculate setValue1:12];
  [myCalculate totalSetValue:12 value2:24];
 
* Calculate *myCalculate = [[Calculate alloc] init];

 
* @private, @protected (기본), @public
 
[클래스 상속 - 초기화]
* 슈퍼클래스 메서드 호출
  [super value1];
  [super print];
 
* 자신의 클래스 메서드 호출, this
  [self value1];
 
* nil : 아무것도 없는 변수, null
  NIL : 아무것도 없는 객체
  nil = NIL 같이 씀

[클래스 확장 (카테고리)]
* 상속 : 수식적 개념
* 카테고리 : 수평적 클래스 확장
  기존(원래) 클래스 수정없이 다른 메소드를 사용 가능 메서드만 추가 가능

* 카테고리 구현 : 헤더, 구현 파일 따로 작성
  @interface 클래스명(카테고리명)
  @implementation 클래스명(카테고리명)
 

[클래스 확장 (포싱)]
* Posing[v] ~ as sb (남을 속이기 위해) ~인 체하다

* [CalculatePosing poseAs:[Calculate class]];
  Calculate 클래스는 CalculatePosing 클래스가 된다.
 
 
[클래스 확장 (프로토콜)]
* 블랙박스 개념, 내부구조는 관심없음

* 여러 클래스에서 공통적인 기능을 하는 메서드를 추려낸다. -> 프로토콜

* 자바의 인터페이스나 C++의 가상클래스와 비슷한 개념

* @protocol 프로토콜명
  @interface 클래스명:super클래스<프로토콜1,프로토콜2,...>
 
 
[다형성 다이나믹 바인딩]
* 다형성 : 같은 이름의 메서드가 서로 다른 기능을 한다.

* id 타입을 통한 동적 바인딩 : 모든 객체를 id타입의 변수로 받을 수 있다. -> 코딩량을 최대 1/10이상 줄여 줌

* 정적 바인딩 : 명확하게 자료형을 선언하는 것

* 동적 바인딩 : 실행파일 만들때 마지막까지 객체의 형에 대한 정보를 확정하지 않다가, 객체의 메서드가
  호출될었을때 비로서 컴파일러가 객체의 형에 대해서 알게 되는 구조

* Isa 변수 : 모든 객체는 Object로부터 상속받은 Isa라는 변수를 가지고 있다.
  단순하게 현재의 객체가 어떤 객체인지를 알려주는 정보를 담고 있는 변수
 
* selector를 통한 동적 메서드 호출
  객체의 메서드를 동적으로 호출 할수 있다.
  함수 포인터와 동일한 개념
  Selector는 Sel형 변수에 저장
 
  SEL sel1, sel2;
  sel1 = @selector(print);
  sel2 = @selector(print2);

  [obj perform:sel1];
  perform: Object에서 상속받은 메서드

 

[Foundation 프레임워크]

* Cocoa : MFC와 같은 기초 프레임워크

  Foundation Framework : Mac에서 쓰이는 Objective-C 라이브러리 프레임워크
  Application Framework : Cocoa 환경에서 GUI를 담당하는 프레임워크
  System Framework : Mac OS 커널 부분
 
* GNU step Dev-C++
  Windows : C:\GNUstep\GNUstep\System\Library\Headers\Foundation
  Mac : /System/Library/Frameworks/Foundation.framework

* #import<Foundation/NSObject.h>

* 읽기 전용 : NSArray, NSData, NSDictionary, NSSet, NSString -> 변환값 리턴
  자기 자신을 변화시킴 : NSMutableArray, NSMutableData, NSMutableDictionary, NSMutableSet, NSMutableString -> void형 리턴
 

* NSRange 구조체
  범위값을 가지고 있는 구조체, 보통 범위안에 있는 무언가를 변화시킬때 많이 쓰임
* NSPoint 구조체
  보통 x,y좌표 값을 객체에 넘길때 씀
* NSSize 구조체
  가로길이, 높이를 가지고 있는 구조체
 
* enum
  NSComparisonResult
 

[NSObject 클래스]

* Foundation 프레임워크 Root 클래스 : 대부분 클래스의 부모
  객체의 생성과 해제를 담당
  추상적인 Base클래스로 이해
 
* -(class) class
    현재 객체의 class를 리턴
  -(id) self
    객체 자체를 리턴
  -(BOOL) isMemberOfClass : (Class) aClass
    현재 객체가 인수 클래스의 인스턴스 인지 확인
  -(BOOL) isKindOfClass : (Class) aClass
    현재 객체가 인수 클래스의 인스턴스 인지, 인수 클래스의 서브클래스 인스턴스인지 확인
  -(class)superclass
    현재 객체가 상속한 슈퍼클래스 클래스 객체 리턴
  +(class)superclass
    클래스의 슈퍼클래스 객체를 리턴
  -(BOOL)isEqual:anObject;
    현재객체와 anObject가 같은 객체인 비교
* +(id)alloc
    지정된 클래스의 인스턴스 생성
  +(id)new
    Alloc+init 조합, 보통은 인스턴스 공유를 위해 쓰임
  +(void)initialize
    클래스의 초기화담당, 프로그램에서 직접 호출하면 안됨
  -(id)retain
    현재 객체의 레퍼런스 카운트 1증가, 객체 자체 리턴
  -(id)autorelease
    현재 객체를 자동 해제풀에 추가, 객체자체 리턴
  -(unsigned)retaincount
    현재 객체의 레퍼런스 카운트값 리턴
  -(oneway void)release
    현재의 객체를 해제, (oneway : 함수 끝날때까지 기다리지 말고 넘어가라. void와 함께만 쓰임)
  -(void)dealloc
    현재 객체들의 모두 release되었을때 실행됨


[NSString 클래스]

* #import<foundation/NSString.h>

* NSString *string = @"I'm happy";
  내부적으로 Unicode화 해서 사용하기 때문에 @사용
 
* -(id)initWithString:(NSString*)string;
    문자열대입을 통한 초기화
  -(unsgned int)length;
    객체의 문자열 길이 리턴
  -(const char*)cString;
    객체의 문자열 반환
  -(NSArray*)componentsSeparatedByString:(NSString*)separator;
    문자열을 separator로 나눈 후 NSArray형태로 반환
  -(NSString*)substringFromIndex:(unsigned int)index;
    Index부터 끝까지 문자 반환
  -(NSString*)substringFromRange:(NSRange)aRange;
    aRange범위의 문자열 반환
  -(NSString*)substringToIndex:(unsigend int)index;
    처음부터 index위치까지의 문자열반환
  -(BOOL)isEqualToString:(NSString*)aString;
    aString문자열과 동일한지 반환
  -(NSComparisonResult)compare
    string비교
  -(NSString*)capitalizedString
    각 단어의 첫글자만 대문자로, 나머지는 소문자로 변환
  -(NSString*)lowercaseString;
    소문자화
  -(NSString*)uppercaseString;
    대문자화
  -(NSRange)rangeOfString
    String이 포함된 범위 반환
  -(NSString*)stringByAppendingString
    현재 문자열의 뒤에 aString을 붙여서 반환
 
* NSMutableString : 객체의 문자열 내용을 바꾸려면 NSMutableString 클래스를 사용
  #import<foundation/NSString.h>
 
  -(id)initWithCapacity
    문자열길이로 초기화한다. 꼭 일치할 필요는 없다
  -(void)appendString
    현재 객체 문자열에 aString을 더한다.
  -(void)deleteCharactersInRange
    현재 객체 문자열에서 range 범위의 문자열을 지운다.
  -(void)insertString
    loc위치에 aString문자열 삽입
  -(void)replaceCharactersInRange
    Range범위의 문자열을 aString으로 바꿈
  -(void)setString
    aString으로 바꿈


[NSValue 클래스]

* wraper class

* 배열,사전,집합 객체는 객체형을 요소로 받음 (NSString, NSSet, NSArray,...)
  char,float,double,int등의 자료형을 Foundation 기반의 프로그램에서는 메서드나 자나 요소로 못 씀
  NSValue, NSNumber는 이런 문제점을 보완하기 위해 char,float,double,int등의 자료형을 객체로 만들어주는 클래스
 
* NSValue -> NSNumber 상속

* NSNull 클래스: nil도 foundation 의 인자,요소로 못 넘김, NSNull로 넘겨야 함

* +(NSNumber*)numberWithBool
    Boolen형을 NSNumber형으로
  +(NSNumber*)numberWithChar
  +(NSNumber*)numberWithDouble
  +(NSNumber*)numberWithFloat
  +(NSNumber*)numberWithInt
  -(BOOL)boolValue;
    Boolean자료 리턴
  -(signed char)charValue;
  -(double)doubleValue;
  -(float)floatValue;
  -(signed int)intValue;
 
[NSArray 클래스]

* #import<Foundation/NSArray.h>

* NSArray는 객체만 담을 수 있다.
  @"I'm happy" - (O) 문자열 객체
  NSValue, NSNull,
  nil은 못넣음
* 배열의 끝에는 nil을 넣는다.

* NSArray는 변경 불가능

* -(id)initWithArray
    array배열로 초기화
  -(id)initWithObjects
    객체들을 인자로 받아서 초기화
  -(id)lastObject;
    마지막 객체를 리턴
  -(BOOL)isEqualToArray
    비교 일치여부 리턴
  -(id)objectAtIndex
    index위치의 객체 리턴
  -(unsigned)count
  -(NSString*)componentsJoinedByString
    NSString요소만 배열로 담고 있는 경우 NSString 각 요소사이에 separator를 붙여서 NSString형으로 리턴
   
* NSMutalbArray
  #import<Foundation/NSArray.h>

  -(void)addObject
  -(void)addObjectsFromArray
  -(void)insertObject
  -(void)removeObjectAtIndex
  -(void)replaceObjectAtIndex
  -(void)replaceObjectsInRange
  -(void)setArray
  -(void)removeAllObjects
  -(void)removeLastObject
  -(void)removeObject
 
 
[NSEnumerator 클래스]

* #import<foundation/NSEnumerator.h>

* NSArray, NSSet, NSDictionary 객체에 순서대로 접근할 수 있는 기능 제공

* 프로그램 종료시 해제

* -(NSArray*)allObjects
    배열형태로 리턴
  -(id)nextObject
    다음객체 리턴
   

[NSSet 클래스]

* #import<foundation/NSSet.h>

* Unique한 객체들의 그룹, 순서 없음
  NSArray는 인덱스를 통해, NSDictionary는 키를 통해 접근
  NSSet는 NSEnumerator로 접근

* -(id)initWithArray
  -(id)initWithObjects
  +(id)setWithArray
  +(id)setWithObject
  +(id)setWithObjects
  +(BOOL)containsObject
    요소 중에 존재 여부 반환
  -(NSArray*)allObjects
  -(unsigned)count
  -(BOOL)isEqualToSet
    객체와 동일한지 확인
  -(BOOL)isSubsetOfSet
    객체가 있는 리턴
  -(NSEnumerator*)objectEnumerator
    현재 객체를 NSEnumerator형으로 리턴

* NSMutableSet
  #import<foundation/NSSet.h>
 
  -(void)addObject
  -(void)addObjectsFromArray
  -(void)intersectSet
    교집합 요소를 현재 객체에 대입
  -(void)unionSet
    합집합을 대입
  -(void)removeAllObjects
  -(void)removeObject


[NSDictionary 클래스]

* #import<foundation/NSDictionary.h>

* 키와 값의 집합을 데이터로 저장하는 객체

* -(id)initWithDictionary
  -(id)initWithObjects
    키,자료 배열의 크기 반드시 일치
  -(id)initWithObjectsAndKeys
    키,자료,키,자료 로 초기화 -> 짝수개가 와야 함
  -(BOOL)isEqualToDictionary
    현재 객체와 동일한지 리턴
  -(NSArry*)allKeys
  -(NSArry*)allValues
  -(unsigned)count
  -(NSEnumerator*)keyEnumerator
    key만 NSEnumertor형으로 리턴
  -(id)objectForKey
    key에 맞는 요소 리턴
 
* NSMutableDictionary
  #import<foundation/NSDictionary.h>
 
  -(id)initWithCapacity
  +(id)dictionaryWithCapacity
  -(void)addEntriesFromDictionary
  -(void)removeAllObjects
  -(void)removeObjectForKey
  -(void)removeObjectsForKeys
  -(void)setObject
  -(void)setDictionary
  -(void)
 

[NSFileManager 클래스]

* 파일, 디렉토리를 다루는 주 클래스
  생성,변경,이동,삭제,복사

* #import<Foundation/NSFileManager.h>

* 파일관련
  +(NSFileManager*)defaultManager
  -(BOOL)fileExistsAtPath
  -(BOOL)copyPath
  -(BOOL)contentsEqualAtPath
  -(BOOL)movePath
  -(BOOL)removeFileAtPath
 
* 디렉토리 관련
  -(NSString*)currentDirectoryPath
  -(BOOL)changeCurrentDirectoryPath
  -(BOOL)createDirectoryAtPath
  -(NSArray*)directoryContentsAtPath
  -(BOOL)removeFileAtPath
  -(BOOL)movePath
 

 
[Memory Management]

* 객체 생성, 소멸

  - 기존
    Calculate *mycalculate = [[Calculate alloc] init]; //생성
    ...
    [mycalculate free]; //해제
   
  - Foundation 클래스
    NSString* myName = [[NSString alloc] initWithString:@"테스트"]; //생성
    ...
    [myName release];//해제

* 자동으로 해제되는 객체들

  - 사용자가 만든 경우 : alloc -> release
 
  - 명시적으로 해제하지 않아도 되는 메서드들이 있음
    예를들어 NSString에서 stringWithFormat 메서드를 사용할 경우 alloc을 사용하지 않아도 객체가 생성됨
    autorelease pool이 이렇게 생성되는 메모리를 자동 해제해 준다.
    개발자는 autorelease pool만 만들어주면 됨

* NSAutoreleasePool (중요)
  프로그램이 끝나는 시점에 자동해제됨
  너무 많으면 해제될때 부하가 걸릴 수 있음

  여기에 넣으면 프로그램 중간에 해제하면 안된다.
  마지막까지 메모리를 잠기게 하는 기능이라고 보면 됨
  객체의 해제 시점을 마지막으로 미루는 것도 됨
 
  반드시 선언해야 하는 것
 
  int main(void)
  {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    .,,
    [pool release];
    return 0;
  }
   
* 메모리 관리
  예) 코엑스 주차장 관리하기
  2천대 주차 가능, 들어갈때 번호표를 뽑음, 나올때 돈을 내고 번호표 반납
  문을 닫을때 차가 한대도 없어야 함
 
  경비원이 퇴근시 주차장 셔터를 내려야 하는데 주차장에 주차여부 쉽게 아는 방법?
  뽑아간 번호표 개수, 반납받은 번호표 개수를 세어봄
 
  번호표를 뽑는다 = 객체를 생성
  번호표 반납 = 객체 해제
  reference count로 관리
 
* reference count
  alloc, retain(보존), new, copy : 1증가
  release : 1감소
 
  autorelease를 했을때는 감소하지 않음
 
  retain : 객체의 소유권을 갖는다. call by reference 개념 때문에 나온 개념
 

* dealloc
  모든 객체가 release되면 마지막에 호출된다
  가장 마지막에 자동으로 호출됨


* 메서드안에서 객체를 생성해서 리턴하는 경우 autorelease로 리턴한다.
  -(NSString*)ReturnNSString {
    NSString *rec = [[NSString alloc] initWithString:@"I am happy"];
    [ret autorelease];
    return ret;
   }

 

[Copy, MutableCopy 메서드]

* 프로토콜이다.

* Foundation 프레임워크 클래스들은 <NSCopying>, <NSMutableCopying>을 모두 따름
  @interface NSString:NSObject<NSCoding, NSCoping, NSMutableCopying>
 
* Copy, MutableCopy 메서드
  retaincount가 1증가
 
* MutableCopy는 Mutable형을 카피할때 사용

* <NSCopying>프로토콜 선언
  @implementation 섹션에 copyWithZone를 구현한다.
  [객체 copy]로 호출
 
  copy가 copyWithZone을 내부적으로 호출
 

 


출처 : http://www.iphonedev.co.kr/xe/42808#0

 
Screen Shot 2011-10-01 at 1.27.49 PM.png 


 JMTabView라는 커스텀 테이블뷰 오픈소스입니다.


탭바선택시 화살표모양의 선택바가 움직이며 현재 선택된 탭바를 알려줍니다.


다운로드는 첨부파일 또는 아래 링크를 참조하세요. 


https://github.com/jasonmorrissey/JMTabView


stretchableImageWithLeftCapWidth 함수가 iOS에서는 안쓰이고 아래 함수를 쓰는 것 같다.
버젼별로 다르게 코딩을 해야하는 듯... 

resizableImageWithCapInsets

http://hoiogi.tistory.com/17
http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5   -> iOS용 함수들
http://hoiogi.tistory.com/17

출처 : http://xion.tistory.com/263

+ Recent posts