AutoReleasePool
먼저 풀을 생성
================
객체1 객체2
================
Pool // 미리 풀을 만듬.
[pool release]
카테고리 : 동적 런타임 디스패치(Dynamic Runtime Dispatch)
카테고리는 기존의 클래스에 새 메서드를 추가 하는 방법이다.(상속 받지 않고도 가능!) - 만능은 아니다!
단점 :
1) 인스턴스 변수를 새로 추가 할 수 없다.
2) 이름 충돌-카테고리 메서드가 기존의 메서드와 동일한 이름을 갖게 되면 카테고리 메서드가 우선시 된다.
기존 메서드를 돌려 사용할 방법이 없다.(하이딩 된다.)
장점 :
1) 클래스 구현을 여러파일로 나누거나, 여러 플랫폼으로 나눌 때
카테고리로 구현 분리하기
거대한 클래스의 구현을 한 파일에 다하기는 힘듬. 카테고리를 논리적인 그룹으로 분리.
[소스]
더보기 접기
//
// main.m
// demo11Category
//
// Created by SDS107 on 12. 3. 28..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
// 새로운 카테고리 추가
@interface NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end
@implementation NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber
{
unsigned long length = [self length ];
return ([ NSNumber numberWithUnsignedLong:length]);
}
@end
int main(int argc, const char * argv[])
{
NSMutableDictionary *dict;
dict = [ NSMutableDictionary dictionary ];
[dict setObject :[@"hello" lengthAsNumber ] forKey :@"helo" ]; // forKey 뒤 => 키값 .
[dict setObject :[ @"iLinkFish" lengthAsNumber ] forKey : @"iLinkFish"];
[dict setObject :[ @"Once upon a time" lengthAsNumber ] forKey : @"Once upon a time"];
NSLog (@" 결과 :%@" , dict);
return 0 ;
}
결과
objc[3259]: Object 0x7fe33b4141f0 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
2012-03-28 12:32:17.968 demo11Category[3259:403] 결과 :{
"Once upon a time" = 16;
helo = 5;
iLinkFish = 9;
}
접기
몇개의 그룹으로 작업 분할(카테고리)
[소스]
더보기 접기
//
// main.m
// demo11Category
//
// Created by SDS107 on 12. 3. 28..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
// 새로운 카테고리 추가
@interface NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end
@implementation NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber
{
unsigned long length = [self length ];
return ([ NSNumber numberWithUnsignedLong:length]);
}
@end
// 두번째 데모
// 몇개의 그룹으로 분리 개발 => 하나로 합쳐서 사용.
@interface CategoryThing : NSObject
{
int thing1;
int thing2;
int thing3;
}
@end
// Category..
@interface CategoryThing(Thing1)
-(void )setThing1:(int ) thing1;
-(int )thing1;
@end
@interface CategoryThing(Thing2)
-(void )setThing2:(int ) thing2; // set
-(int )thing2; // get
@end
@interface CategoryThing(Thing3)
-(void )setThing3:(int ) thing3;
-(int )thing3;
@end
@implementation CategoryThing
-(NSString *)description
{
NSString *desc;
desc = [NSString stringWithFormat :@"%d %d %d" , thing1 , thing2 , thing3 ];
return desc;
}
@end
@implementation CategoryThing(thing1)
-(void )setThing1:(int )t1
{
thing1 = t1;
}
-(int )thing1
{
return thing1 ;
}
@end
@implementation CategoryThing(thing2)
-(void )setThing2:(int )t2
{
thing2 = t2;
}
-(int )thing2
{
return thing2 ;
}
@end
@implementation CategoryThing(thing3)
-(void )setThing3:(int )t3
{
thing3 = t3;
}
-(int )thing3
{
return thing3 ;
}
@end
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[ NSAutoreleasePool alloc ] init ];
NSMutableDictionary *dict;
dict = [ NSMutableDictionary dictionary ];
[dict setObject :[@"hello" lengthAsNumber ] forKey :@"helo" ]; // forKey 뒤 => 키값 .
[dict setObject :[ @"iLinkFish" lengthAsNumber ] forKey : @"iLinkFish"];
[dict setObject :[ @"Once upon a time" lengthAsNumber ] forKey : @"Once upon a time"];
NSLog (@" 결과 :%@" , dict);
// 실제사용
CategoryThing *thing = [[[ CategoryThing alloc ] init ] autorelease ];
[thing setThing1 :10 ];
[thing setThing2 :20 ];
[thing setThing3 :30 ];
NSLog (@" 내부 값 : %@" , thing);
[pool release ];
return 0 ;
}
결과
objc[3269]: Object 0x7fe5304141f0 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
2012-03-28 12:34:47.805 demo11Category[3269:403] 결과 :{
"Once upon a time" = 16;
helo = 5;
iLinkFish = 9;
}
2012-03-28 12:34:47.807 demo11Category[3269:403] 내부 값 : 10 20 30
접기
프로토콜
프로토콜은 선언만 하며, 구현은 하지 않는다. 규약만 지정.
프로토콜로 인하여 다중 상속이 가능하다.
UI 할 때 약방의 감초 처럼 애플에서 만든 프로토콜을 채택한다고 한다.
여기에서는 상속이라는 말보다 프로토콜을 채택한다고 흔히 말한다.
채택할려면 프로토콜 이름을 클래스의 @interface 선언에 나열해주어야 한다.
- 자바나 C#의 인터페이스와 같다.
다시 정리 해보면
* 프로토콜 : 규약, 규격, 호환성을 위한 부분.
(USB단자, PCI버스)
홈씨어터
삼성TV
(영상 : 컴포넌트, 컴포지트 단자)
---------------------->
소니블루레이플레이어 데논 엠프
---------------------------------------->
(음성 : 광단자, 동축단자)
[선언]
@protocol NSCopying
-(id)copyWithZone:(NSZone *)zone; // copyWithZone 메소드를 반드시 구현해야한다. (강제사항)
@end
* 구현
더보기 접기
//4) 메서드 추가
- (id ) copyWithZone:(NSZone *) zone
{
Tire *tireCopy;
tireCopy = [[[self class ] allocWithZone :zone]
initWithPressure :pressure
treadDepth :treadDepth ];
return (tireCopy);
}
//=============
접기
// 아래와 같이 < > 사이에 있는것이 프로토콜 명이다. 해당 클래스의 메소드는 반드시 구현되어야 한다.
@interface Engine : NSObject < NSCopying>
@end // Engine
전체적인 소스
더보기 접기
//
// main.m
// demo11Protocol
//
// Created by SDS107 on 12. 3. 28..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol CDPlayer <NSObject >
-(void )play;
-(void )pause;
-(void )stop;
@end
// 일반 클래스에서 프로토콜을 채택
@interface HomeCDPlayer : NSObject <CDPlayer >
@end
@implementation HomeCDPlayer
-(void )play
{
NSLog ( @"현재 연주중 ");
}
-(void )pause
{
NSLog ( @"잠시 중단 ");
}
-(void )stop
{
NSLog ( @"연주 완료 ");
}
@end
@interface MobileCDPlayer : NSObject <CDPlayer >
@end
@implementation MobileCDPlayer
-(void )play
{
NSLog ( @"현재 연주중 (튐방지 )");
}
-(void )pause
{
NSLog ( @"잠시 중단 ");
}
-(void )stop
{
NSLog ( @"연주 완료 ");
}
@end
int main(int argc, const char * argv[])
{
HomeCDPlayer *home = [[ HomeCDPlayer alloc ] init ];
MobileCDPlayer *mobile = [[ MobileCDPlayer alloc ] init ];
[home play ]; [mobile play ];
[home stop ]; [mobile stop ];
[home release ];
[mobile release ];
return 0 ;
}
결과
2012-03-28 14:31:16.888 demo11Protocol[3407:403] 현재 연주중
2012-03-28 14:31:16.890 demo11Protocol[3407:403] 현재 연주중 ( 튐방지 )
접기
Fondation 프레임 워크
1) NSNumber : 값을 객체형식으로 다룰 경우에 사용.
힙에다가 저장 해놓고 씀. 값을 살짝 포장했다고 보면 된다.
2) NSRange : 문자열을 검색할 경우 사용.(구조체 형식임.)
Hello,Objective C!
7 15
range.location=7, range.length=15-7
3) NSString : 문자열을 처리하는 클래스
- NSString이 가지고 있는 메소드 : stringWithFormat, isEqualToString: , hasPrefix
4) NSMutableString : 문자열을 변경해야 하는 경우
- stringWithCpapcity
더보기 접기
//
// main.m
// demo15String
//
// Created by SDS107 on 12. 3. 28..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *str;
str= @"MovieFile.mov";
NSLog (@" 문자열의 길이 :%li" , [str length]);
str = [NSString stringWithFormat :@" 이런 문자열 :%d" , 20 ];
NSLog (@" 결과 :%@" , str);
NSString *thing1 = @"Hello 5" ;
NSString *thing2 = [NSString stringWithFormat :@"Hello %d" , 5 ];
//객체를 비교
if (thing1 == thing2){
NSLog (@" 같은 객체 " );
}else
NSLog (@" 다른 객체 " );
// 문자열을 비교
if ([thing1 isEqualToString :thing2])
NSLog (@" 같은 문자열 " );
else
NSLog (@" 다른 문자열 " );
// 변경 가능한 문자열 형식
NSMutableString *string;
string = [NSMutableString stringWithCapacity :50 ];
[string appendString :@"Hello there" ];
[string appendFormat :@"Human %d" , 40 ];
NSLog (@" 결합된 결과 :%@" , string);
// 특정 단어를 삭제
NSMutableString *friends;
friends = [NSMutableString stringWithCapacity :50 ];
[friends appendString : @"James Jonathan Jack Eva"];
// 단어 찾기
NSRange jackRange;
jackRange = [friends rangeOfString :@"jack" ];
jackRange.length ++;
[friends deleteCharactersInRange :jackRange];
NSLog (@" 단어 삭제후 :%@" , friends);
jackRange = [friends rangeOfString :@"Jonathn" ];
[friends replaceCharactersInRange:jackRange withString: @" 조나단 " ];
NSLog (@" 단어 치환후 :%@" , friends);
return 0 ;
}
결과
2012-03-28 17:32:16.986 demo15String[3698:403] 문자열의 길이 :13
2012-03-28 17:32:16.988 demo15String[3698:403] 결과 : 이런 문자열 :20
접기
5) NSarray : 배열
더보기 접기
//
// main.m
// demo15Array
//
// Created by SDS107 on 12. 3. 28..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSArray *array;
array = [NSArray arrayWithObjects :@"One" ,@"Two" ,@"Three" , nil ];
NSLog (@" 갯수 :%li" , [array count ]);
for (int i=0 ; i < [array count ]; i++){
NSLog (@" 첨자 :%d 값 :%@" , i, [array objectAtIndex :i]);
}
// 문자열을 배열로 리턴
NSString *string = @"oop;ark;bok;grreble;ponies";
NSArray *chunks = [string componentsSeparatedByString: @";" ];
NSLog (@" 방의 갯수 :%li" , [chunks count]);
// 다시 문자열 합치기
string = [chunks componentsJoinedByString :@":)" ];
NSLog (@" 합친 결과 :%@" , string);
return 0 ;
}
결과
objc[3591]: Object 0x105614180 of class __NSArrayI autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
2012-03-28 16:26:19.073 demo15Array[3591:403] 갯수 :3
2012-03-28 16:26:19.075 demo15Array[3591:403] 첨자 :0 값 :One
2012-03-28 16:26:19.076 demo15Array[3591:403] 첨자 :1 값 :Two
2012-03-28 16:26:19.076 demo15Array[3591:403] 첨자 :2 값 :Three
2012-03-28 16:26:19.077 demo15Array[3591:403] 방의 갯수 :5
2012-03-28 16:26:19.077 demo15Array[3591:403] 합친 결과 :oop:)ark:)bok:)grreble:)ponies
접기