오브젝트C2010.10.12 13:05
[objective-c] 오브젝트 c에 대한 기본적인 개념 정리

2.1 오브젝티브-C, OOP를 위한 언어

2.1.1 역사

2.1.2 클래스와 인스턴스

2.1.3 메시징

  오브젝트-C의 함수 호출은 대괄호[]이며

 오브젝트가 앞에 오고 오브젝트의 메소드가 뒤에 붙는 형식

ex1) myView라는 뷰에서 aquaGradient라는 그러디언트를 그리는 오브젝트-C함수

[myView drawMyGradient:aquaGradient fromValue:0.0 toValue:1.0 opaque:YES];

 오브젝트     메소드이름         매개변수1       매개변수2      매개변수3   매개변수4

  

> 호출되는 함수의 형식? 예-

- (void)drawMyGradient:(CGGradientRef)gradient fromValue:(float)start toValue:(float)end opaque:(BOOL)opaque

  

ex2) 리턴값을 받는 함수 호출

destStr = [sourceStr subStringFrom:2 to:5];

  

sourceStr오브젝트의 클래스안에는 다음과 같은 메소드가 들어있을 것이다.

- (NSString*)subStringFrom:(int)from to:(int)to

  

ex3) 리턴되는 값이 코코아클래스의 인스턴스라면 대괄호를 다시 만들어서 또 다른 메소드를 호출해야함

hashValue = [[sourceStr subStringFrom:2 to:5] hash];

  

2.1.4 인스턴스 변수와 엑세서 메소드

  (클래스는 내부적으로 멤버변수(인스턴스변수)를 가질수 있고 외부에서 직접 멤버변수에 접근할수 없다)

  

접근하는 메소드 getter, setter

  

getter는 메소드 변수의 이름을 그대로 사용

Person이 클래스 이름, 인스턴스 변수 name, 인스턴스 오브젝트 me

ex) NSString *myName = [me name];

  

setter 메소드

- 변수 이름앞에 set을 붙이고 변수의 첫 문자를 문자로 바꿈

ex) [me setName:@"Yoon"];

  

2.1.5 코코아 클래스 만들기

  코코아 클래스 : 헤더파일 + 임플리먼트 파일

  

1. 헤더(.h)

  @interface, @end로 구성

  

@interface 클래스:슈퍼클래스(<프로토콜>)

(프로토콜은 생략가능)

{

    // 인스턴스 변수

}

//메소드 구현

@end

  

2. 임플리먼트 파일(.m)

  @implement 클래스이름

// 메소드 구현

  

@end

  

2.1.6 헤더포함

 : #import는 다른 클래스의 헤더를 불러오는 역할

 : #include와 비슷하지만 중복 포함 에러 예방

 : 큰따옴표""는 프로젝트 안에서 바로 찾을 수 있는 파일에 사용

 : <>는 경로를 이용해 찾아야 하는 헤더 파일에 사용

 : 하지만 <>는 교차 포함의 에러를 방지하지 못함, 이런경우 헤더파일에서는

   @class 클래스이름

   위 형식으로 클래스의 존재만 알리고 임플리먼트파일에서 실제 #import하는 것이 좋다.

 

2.2 메모리 관리

2.2.1 원칙

 : "만든곳에서 릴리즈한다"-> 이 원칙은 OOP(Object Oriented Programming)(Object-C책 보기ㅠ)

 : 어떤 인스턴스 오브젝트에 값을 넣을때 넣는 쪽에서 릴리즈하고 받은 쪽에서 보관해야함.;

 : 오브젝트의 라이프 사이클 관리는 구현의 측면에서 본다면 오브젝트의 리테인 카운트(retain count)를 관리하는 것

 : 오브젝트의 리테인 카운트가 1이상이면 오브젝트가 살아있는 것이며 리테인 카운드가 0이 되면 해당 메모리는 해제

 "이 오브젝트는 언제 리테인 카운트를 0으로 만들어야 하는가?"

 

2.2.2 alloc, retain, release

 : 모든 코코아 오브젝트가 사용할 수 있는 메소드

 : NSObject에 선언된 메소드

 

 > NSOjbect

 : 코코아의 루트 클래스

 : NSobject프로토콜은 NSObject가 준수하는 프로토콜

 

 

 +alloc 메소드를 받으면 특정 클래스의 인스턴스 오브젝트가 메모리에 전개되며 리테인 카운트는 1이 됨

 

- retain 메소드르 받은 오브젝트의 참조 카운트는 1 증가, 어떤 오브젝트를 확실하게 보호하고 싶을때 retain 호출

 

- release 메소드를 받은 오브젝트의 참조 카운트는 1감소, 오브젝트의 사용을 마치면 오브젝트에 release 메소드를 보냄으로써 오브젝트를 메모리에서 해제

 

2.2.3 +메소드와 -메소드

: +가 붙은 메소드는 클래스에서 바로 호출

: -가 붙은 메소드는 인스턴스 메소드

: 메모리와 관련해서 +메소드를 이용해 생성한 인스턴스 오브젝트는 +alloc, -init을 이용해 생성하고 초기화한 인스턴스 오브젝트와 달리 오브젝트의 라이프 사이클을 관리할 필요가 없음

 

> 런타임

 : 애플리케이션이 기동되면 애ㅡㄹ리케이션에 연결되어 있는 프레임워크의 모든 클래스들이 오브젝트화 됨

 ex)NSString이라는 클래스가 있다면 NSString이라고 하는 클래스 오브젝트가 애플리케이션 시동와 함께 생성, 클래스 오브젝트와 함께 함수 포인터의 테이블이 생성,

NSString을 서브클래스해서 MyString이라는 클래스를 만든다면 오버리아디한 메소드는 MyString의 함수 포인터를 가리킬 것이고 오버라이드하지 않은 메소드는 NSString의 함수 포인터를 가리킬 것이다.

 

2.2.4 addObject, addSubView

 : 코코아에는 몇가지의 컬렉션이 있다.

 : 오브젝트가 컬렉션에 더해지면 그 순간 리테인 카운트가 1증가, 그리고 컬렉션에서 제외되는 순간

   리테인 카운트가 1감소

   -> 컬렉션 바깥에서 리테인 카운트를 관리하면 됨

 

 

 

 >> 컬렉션(?)

 

 

ex) NSString *stringObject = [[NSString alloc] initWithString:@"Yoon"];

[mutableArray addObject:stringObject[; // array에 스트링 넣음

[stringObject release];

 

위의 코드는 stringObject의 주소값은 mutableArray에 살아있고

stringObject가 그 mutableArray 안에 있는 한 보호된다는 것.

 

* 뷰 오브젝트 또한 컬렉션과 유사한 방식으로 운용

뷰를 만들어서 다른 뷰에 서브 뷰로서 더하면 그 서브 뷰의 오브젝트 사이클은 슈퍼뷰가 관장하므로

서브 뷰는 슈퍼뷰의 외부에서는 리테인 카운트가 0이 되어야 함

 

2.2.5 autorelease pool

 : "곧 릴리즈 될 오브젝트들이 모여 있는 곳"

 : 코코아의 런타임은 매 이벤트 발생 시마다 오토릴리즈 풀에 있는 오브젝트를 메모리에서 제거

 : 어떤 오브젝트를 오토릴리즈로 선언하는 것은 이 메소드 내에서

   수명은 보장하되 이 메소드가 끝나면 언제 없어지든 상관하지 않겠다는것을 의미

 : 오토릴리즈로 선언하는 방법 -> +메소드를 이용하여 생성한 인스턴스 오브젝트

 ex)

 

 //NSString은 클래스 

NSString *stringObject;

//아래 두개 다 오토릴리즈...

//alloc, init, autorelease

stringObject = [[[NSSTring alloc] initWithString:@"Yoon"] autorelease];

//init with release

stringObejct = [NSString stringWithString:@"Yoon"];

 

(아- 잘 모르겠다;)

 

 : 오토릴리즈는 메소드 내에서 오브젝트를 만들어 리턴한 뒤 릴리즈 해야할 때도 사용됨

 

-(NSString *)fullName

{

   NSString *composedString = [[NSString alloc] initWithFormat:@"%@ %@,

                                                 firstName, lastName];

   [composedString release];

   return composedString;

}

 

 

성과 이름을 합쳐서 문자열을 만든 뒤 리턴하는 메소드

composedString은 메모리에 alloc되었으므로 release해야하는데

문제는 release되는 시점(;)

리턴 전에 릴리즈를 해야하는데 이 경우 이미 릴리즈된 포인터를 리턴하게 되는 문제가 생김

그러므로 일단 리턴한 뒤 약간의 시간차를 두고 릴리즈하는것이 필요

즉, 릴리즈를 예약^^

-(NSString *)fullName

{

   NSString *composedString = [[NSString alloc] initWithFormat:@"%@ %@,

                                                 firstName, lastName];

   [composedString autorelease];

   return composedString;

}

 

autorelease메소드는 모든 코코아 오브젝트에 대해 릴리즈를 예약하는 것

일단 리턴되는 시점까지는 메모리가 보호되며 안정적으로 리턴된 뒤 일정 시점이 지나면 릴리즈됨

 

2.3 Delegate, Subclass

2.3.1 Delegate

 : "그대로 위임한다"

 : 누가?

   - 델리게이트를 필요로 하는 오브젝트는 주로 View의 서브클래스들이나 Controller 오브젝트

 : 무엇을?

   - 이벤트에 대한 처리 권한을 위임

   - 자기 자신에게 일어난 문제를 자기가 직접 처리하지 않고 다른 오브젝트에 위임해서 처리하는 방식

 : 누구에게?

   - 기존의 클래스 중 해당 이벤트를 가장 잘 처리할 수 있는 클래스가 위임을 맏음

      (델리게이트를 처리하기 위해 별도의 클래스를 정의하기도 함)

ex) UIApplication클래스의 델리게이트 메소드는 -applicationDidFinishLaunching:메소드

 UIApplication클래스는 애플리케이션이 시동될 때 생성되고 종료되면 없어지는 싱글톤(애플리케이션 내에 유일한 오브젝트) 패턴의 오브젝트이다.

 

2.3.2 Subclass

 : 클래스를 상속받아 기능을 확장하거나 원래의 기능을 변경하는 것

 : 코코아는 단일상속 체계를 가진다.

   -> 모든클래스는 하나의 슈퍼 클래스만을 가지고 있다.

   -> 최상위 클래스인 root클래스로 NSObject가 존재

 

2.3.3 Subclass? Delegate?

  : 동일 목적 -> UI 요소 등에 발생한 이벤트를 처리하는 것

  ex) "사용자가 리턴키를 입력하면 특정한 반응을 하길 바란다"

 위 작업을 수행하기 위해서

키 입력과 관련된 메소드를 오버라이드해서 들어온 키가 리턴키인 경우를 얻어내려고 하지만;

서브클래싱은 작업이 만만치 않다.

이때 필요한것이 델리게이트 패턴

개발자가 복잡한 내부구조를 몰라도 이벤트 발생시에 델리게이트로 지정된 오브젝트에 양속된 메소드를 호출해 주는것

(잘- 모르겠다;)

 

2.3.4 프로토콜

 : "구현하기로 약속한 메소드"

 : 특정 프로토콜을 구현하는 클래스를 만든다면 프로토콜에 명시되어 있는 메소드를 전부 또는 일부 구현함으로써 프로토콜의 기능을 구현하게 됨

 

2.4 용어정리

2.4.1 IBOutlet & IBAction

  : 인터페이스 빌더 파일과 연결되는 인스턴스 변수와 액션 메소드임을 선언하는 예약어

  : IBAction값은 void형

 

2.4.2 id

 : id 타입으로 정의한 변수의 type은 컴파일 시가 아닌 런타임 시에 결정

 

2.4.3 SEL, @selector()

 : SEL은 함수에 대한 참조를 가짐

   -> 즉 함수 포인터임

   -> 컴파일된 오브젝트-C는 함수테이블을 만들고 구별자와 메소드를 적어둔 뒤 런타임 시에 매칭시키는 방식 사용

   -> 이때 컴파일된 셀렉터의 타입이 SEL이며, 메소드 이름을 이용해 SEL를 얻어내는 지시어가 @selector()

        임

 

 

 

Posted by 오늘마감
아이폰 어플 , 가속도 센서에 대한 정리

가속 센서를 이용한 시장 리뷰  http://mobizen.pe.kr/836

............................................................................................................................................................................................

아이폰 기기를 포트레이트모드(일반켰을때 모드인듯.)로 정면을 바라보고 있으면 가속도 센서는 -y방향으로 1, 아이폰을 책상 위에 올려두면 -z방향으로 1의 값을 가짐

가속도 센서가 값을 넘겨주는 주기는 우리가 결정가능

최대 1초에 10번~100번가능,

애플리케이션에 가해지는 부하때문에 유틸리티 같은 애플리케이션에서는 20번을 넘지 않도록 함

만약 게임같이 많이 사용하는 경우라도 60번을 넘지않도록 해야함.

>> 가속도 센서의 값을 이용하는 클래스들

1. UIDevice

UIDevice클래스를 이용하면 아이폰 기기에 대해 싱글톤 접근을 할수 있음

(싱클톤 : 해당 어플리케이션 내에서 유일한 하나의 객체임을 보증하기 위한 방법

    - 목적 : 객체를 하나면 만들기 위해

               프로젝트파일에서 모두 공유하기 위해

    - 장점 : 전역변수를 사용하는 것보다 위험성이 적음, 객체가 두번 이상 생성되는

               실수도 자동 방어)

기기 방향의 변경을 알려주는 노티피케이션 제공

( 노티피케이션 : 오브젝트가 멀리 떨어져 있어 서로 알지 못하는 경우 유용하게 사용

   노티피케이션 센터 : 애플리케이션 내에 유일한 오브젝트(싱글톤 객체)

                            오브젝트 내의 어느 곳에서 접근하더라도 동일한 노티피케이션 센터에

                            접근하게 됨.

                            노트피케이션 센터에 자신이 관심을 가지는 메시지가 올라오는지 지켜

                            보는 오브젝트가 있으며 노티피케이션 센터에 메시지를 올리는 오브젝트

                            존재, 특정 메시지가 올라오면 그 메시지에 관심이 있는

                           오브젝트로 메시지가 전달되며 각자 할일 수행)

아래 코딩은 호출을 통해 디바이스의 방향 전환에 대한 노티피케이션을 받겠다고 선언

[[UIDevice currentDevice] beginGeneratingDeviceOrientatonNotifications];

노티피케이션 센터 리턴하는 코딩

[NSNotificationCenter defaultCenter];

노티피케이션 센터에 통지 올리기

AAA라는 이름의 통지 올리기

아래 코딩을 사용하면 노티피케이션 센터에 통지가 올라갈 뿐만 아니라

통지를 받겠다고 등록한 모든 오브젝트에 메시지가 전달

[[NSNotificationCenter defaultCenter[postNotificationName:

@"AAA" object:self userInfo:nil];

object는 노티피케이션에 함께 동봉되는 오브젝트, 오브젝트 안에 self를 넘기는 이유는 노티피케이션을 받는 쪽에서 필요하면 사용할 수 있도록 함.

userInfo는 우리가 임의의 항목을 만들어서 구독받는 오브젝트에 알릴 수 있도록 함.

또한 임의의 데이터를 패키징하는 딕셔너리,

예) 현재 시각값을 가지는 NSDate 오브젝트를 @"nowDate"라는 키와 쌍을 이뤄

딕셔너리에 넣어준 뒤 보내면 노티피케이션을 구독하는 쪽에서 필요에 따라 그 값을 읽어서 사용

할수 있음.

노티피케이션 센터에 자기 자신을 관찰자로 등록하는 내용

AAA라는 이름의 통지가 올라오면 내가 -addBBB:라는 메소드를 실행시키겠다는 의미

[[NSNotificationCenter dafaultCenter] addObserver:self

selector:@selector(addBBB:) name:@"AAA" object:nil];

UIDevice에서 사용하는 노티피케이션 발행

UIDeviceOrientationDidChangNotification - 디바이스의 현재 방향

(기기의 방향이 바뀌었다는 통지가 날라오면 UIDevice클래스로부터 orientation

프라퍼티를 읽어서 방향 변화에 대한 처리를 함)

UIDeviceBatteryLevelDidChangeNotification - 배터리의 레벨이 변함

디바이스 방향이 더 이상 필요 없을 경우엔

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

호출을 통해 가속도 센서의 이용을 끝내야함.

(가속도 센서를 전원을 많이 소모하는 장치임)

2. UIApplication

애플리케이션에 대한 싱글톤 접근 가능

스테이터스 바(status bar)의 방향을 설정 할 수 있는

statusBarOrientation 프라퍼티 제공

3. UIViewController

이 클래스는 interfaceOrientation프라퍼티를 가지고 있으며

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

메소드를 오버라이드해서 뷰 컨트롤러가 관리하는 뷰가 디바이스의 변화에 대응할지를 YEs나

NO값으로 리턴함

4. UIResponder

터치이벤트가 시작되는 클래스

motion이벤트 : 아이폰의 움직임에 대해 이벤트를 발생시키는 모션.

                    아이폰 3.0에서는 쉐이크밖에 제공하고 있지 않음.

5. UIAcceleometer

가속도 센서에 대한 싱글톤 접근 제공

 UIAccelerometer* theAccel = [UIAccelerometer sharedAccelerometer];

theAccel.updateInterval = 1/30;

theAccel.delegate = self;

+sharedAccelerometer 메소드로 가속도 센서에 접근

1초에 30번 가속도 센서의 값을 전달받겠다고 설정

theAccel의 델리게이트를 self로 지정하면 델리게이트 프로토콜 메소드를 구현해야 함.

 -(void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration

{

   // 이벤트 데이터 얻어온다.

   UIAccelerationValue x,y,z;

   x = acceleration.x;

   y = acceleration.y;

   z = acceleration.z;

   // 데이터 처리 코드가 이어져야 한다.

}

UIAccelerameter 오브젝트는 싱글톤이므로 유일한 객체,

따라서 델리게이트메소드 역시 하나만 지정

따라서 하나의 애플리케이션에는 하나의 델리게이트 메소드 역시 하나.

UIAcclerationValue의 값은 double이며, 1이 1g(중력값)을 나타냄

- 하이패스 필터(high pass filter)

 아이폰이 항상 받고 있는 중력값을 필터링해서 없애버리고 움직임만을 얻어내는 기법.

아이폰이 중력에 대해 어떤 상태로 있든 상관없이 저지해있기만 하면

x,y,z값은 0으로 설정하고 움직이는 방향에 대한 값만을 제공하는 것.

  UIAccelerationValue acceleration[3];

 UIAcclerationValue history[kHistorySize][3];

 // 하이패스 필터 기능을 켰는지 점검

 if(filteringIsEnable){

     accleraion[0] = x*kFilteringFactor + acceleration[0]*(1.0-                            kFilteringFactor);

     history[nextIndex][0] = x-accleration[0];

    accleraion[1] = x*kFilteringFactor + acceleration[1]*(1.0-                            kFilteringFactor);

     history[nextIndex][1] = x-accleration[1];

    accleraion[2] = x*kFilteringFactor + acceleration[2]*(1.0-                          kFilteringFactor);

     history[nextIndex][2] = x-accleration[2];

  } else {

     history[nextIndex][0] = x;

     history[nextIndex][1]  = y;

     history[nextIndex][2] = z;

  }

 kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

그래프는 histroy배열에 값에 의해 그려지며 history는 최근 3개의 x,y,z값을 가진다.

acceleration배열은 현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.

그리고 그 값을 다시 현재 가속도 센서의 x값에서 뺀 값을 이용해 움직임에 대한 수치만 history에 넣어서 그래프를 그리는데 사용

-로우패스 필터

미세한 움직임을 필터링하고 중력값을 주로 이용하기 위해 가속도 센서의 값을 가공

즉, 가속센서의 그래프에서 많이 튀는것은 하이패스필터로 잡고

작게 튀는것은 로우패스 필터로 잡는다.

  UIAccelerationValue accel[3];

 accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 -                      kFilteringFactor);

accel[1] = acceleration.x * kFilteringFactor + accel[1] * (1.0 -                      kFilteringFactor);

accel[2] = acceleration.x * kFilteringFactor + accel[2] * (1.0 -                      kFilteringFactor);

kFileteringFactor는 다음과 같이 정의되어 있음

#define kFilteringFactor 0.1

현재 가속도 센서의  x값을 0.1비중으로

이전 x값을 0.9비중으로 각축 방향의 값을 구한다.



출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=30
Posted by 오늘마감
아이폰42010.09.10 08:08
아이폰4 출시 연기의 이유에 대한 논란을 알아보니..

한국만 출시 연기

▶스티브 잡스 애플 CEO는 16일(현지시간) 열린 프레스컨퍼런스에서

"정부의 승인이 지연돼 한국은 이번 출시에서 제외됐다"

“한국 정부의 승인을 받는 데 시간이 걸린다(a delay in receiving government approval)"

이를 두고 다양한 문제 제기

아이폰4, 왜 한국서만 ‘담달폰’… 애플팬 ‘부글’ [동아일보]

잡스 "한국정부 승인 늦어져" 한마디에 억측 난무 [이데일리]

아이폰4출시지연논란승인에시간걸린다” “아직신청도” [중앙일보]

'담달폰된 아이폰4'…억측 속 방통위까지 발끈 [경향신문]

아이폰4' 국내 출시연기...엇갈리는 '희비' [머니투데이]

"스티브 잡스는 한국을 출시 국가에서 제외한 것이 한국 정부 승인과 관련된 문제라고 밝혔다"며 "그러나 18일 현재 애플사는 한국 정부에 인증을 신청한 바가 없다" [방통위]

이에 대한 KT의 입장

KT 승인을받는시간이걸리는아니라승인을받기전에마쳐야하는준비과정이끝나지않았기때문이라고해명

표현명 KT 개인고객부문 사장은 이날 트위터를 통해 "아이폰4 출시에는 전혀 변함이 없다" "19일 출시일정을 밝힐 것"



출처 : http://blog.naver.com/PostView.nhn?blogId=itgoon&logNo=40110737925
Posted by 오늘마감
오브젝트C2010.08.12 16:40
Object-C : Declared Properties 에 대한 깔끔한 정리

이번에는 Object-C의 Property에 대해서 이야기를 해볼까 합니다.

어떻게 보면 조금 필요없어 보일수도 있고 어찌보면 MVC(Model, View, Controller)개발 기법과도 밀접한 연관이 있어 보입니다.

하지만 일반적으로 MVC개발에서도 setter/getter로 구성 된 도메인 객체를 따로 두고 있듯이 Object-C에서도 역시 비슷한 구현을 할 수 있는것 같습니다.

Object-C에서 일반적으로 객체의 Property에 접근하기 위해서는 한쌍의 접근자 메서드(getter/setter)를 사용합니다.

이 메서드들을 사용함으로써 객체지향 프로그래밍의 캡슐화(Encapsulation)에 더욱 충실 할 수 있습니다.

관련된 자료는Object-Oriented Programming with Objective-CMechanism Of Abstraction을 찾아보라고 하는군요.

Property를 정의함으로써 효과적으로 접근자 메서드들을 간략화 시키는 효과를 가져올 수 있습니다.

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

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

@property(attributes) type name;


하나의 Property 선언은 두개의 접근자 메서드와 동일한 기능을 갖습니다.

@proprtyfloat value;


위의 선언은 다음과 같이 두가지 메서드를 선언한것과 같은 기능을 하게 됩니다.

-(float)value;
-(void)setValue:(float)newValue;



@property 지시자의 attributes 에는 다음과 같은 정의를 할 수 있습니다.

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

setter=settername
Property의 setter 메서드 명은 setPropertyName:입니다. (예 : Property가 foo일 경우 setFoo:)
역시나 이 기본 설정을 내가 원하는 메서드명으로 변경 할 수 있습니다.

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

readonly
Property의 값을 단지 읽기만 할수 있다고 정의하는 속성입니다.
이 속성은 @implementation 블럭 안에서 오로지  getter 메서드만 필요할 경우에 사용합니다.
@synthesize 지시자를 사용하였을 경우에는 역시나 getter 메서드의 역할만을 하게 됩니다.
값을 대입 하려고 할 경우 에러를 출력하게 됩니다.

assign(DEFAULT)
단순하게 값을 대입합니다. 기본설정입니다. 이전에 어떤 객체를 가리키고 있던 Property라면 이로 인해 해당 객체는 미아가 되어 메모리릭의 주범이 될 수 있습니다. 가비지콜렉터를 사용하지 않는다면 사용을 피해야 합니다.

retain
이것은 assign과 비슷하지만 조금 다릅니다. 이전에 가리키고 있던 객체가 있다면 해당 객체를 Release하여 메모리에서 제거 합니다. 가비지콜렉터를 사용한다면 결과적으로 assign과 동일한 결과를 가지겠지만 좀더 명시적으로 사용해 주면 좋을것 같습니다.

copy
객체를 바로 대입하지 않고 해당 객체의 복사 메서드를 Invoke호출합니다.
그리하여 다른 메모리 영역에 복사본을 만든 다음 그것을 반환하게 됩니다. 이전에 가리키고 있던 값은 Release 시킵니다.

nonatomic
이 속성은 접근자 메서드가 Atomic 하지 않게 동작하게 합니다(?). 기본적으로 접근자는 Atomic하게 동작합니다.
Atomic이라는 말은 멀티스레드 등으로 구성된 프로그램이 특정 접근자 메서드를 호출할때 서로 충돌이 나지 않도록(보통 세마포어니 크리티컬섹션이니 하는 말들 들어보셨을겁니다.) 객체 레벨에서 Lock을 걸고 Property에 접근하게 되는데요 매우 좋은 이야기지만 접근할때 마다 Lock을 걸고 다시 푸는 작업이 반복되므로 퍼포먼스를 떨어뜨리는 결과를 가져오게 됩니다.
이런 접근이 필요없다면 이 속성을 사용하여 Non-Atomic하게 동작하도록 만들어 주시는 것이 좋습니다.

이제 Property에 대해 거의 모든것을 알게 된것 같네요. 이제 예제를 한번 볼까요?

@interfaceMyClass:NSObject{
   
NSString*value;
}
@property(copy, readwrite)NSString*value;
@end

@implementationMyClass
@synthesize value;
@end


value라는 이름의 Property의 getter 메서드 명은 value이고 setter 명은 setValue입니다.

값을 대입할때 복사가 일어나고 읽고 쓰기를 할 수 있습니다. 또한 nonatomic 속성이 없으니 atomic하게 동작하겠군요.

마지막으로 Property를 사용할때 주의사항이 한가지 있습니다.

객체가 제거 될때 소멸자로 dealloc이 호출되는데 Property들이 자동으로 소거되지 않아 명시적으로 제거해 주셔야 합니다.

-(void)dealloc {
   
[value release];
   
[super dealloc];
}


출처 : http://blog.naver.com/PostView.nhn?blogId=74hans&logNo=109471860

'오브젝트C' 카테고리의 다른 글

다른언어와 다른 Objective-C 만의 특징  (0) 2010.08.31
Objective-C의 기초  (0) 2010.08.22
Object-C : Declared Properties 에 대한 깔끔한 정리  (0) 2010.08.12
Hello iPhone - 1  (0) 2010.08.11
The Objective-C 2.0 Programming Language  (0) 2010.06.24
Objective-C  (0) 2010.06.22
Posted by 오늘마감
아이폰어플정보2010.06.23 21:14
법에 대한 재미있는 접근, '법아! 놀자.'

[아이폰/어플] 법에 대한 재미있는 접근, '법아! 놀자.'

얼마전 무료어플 Best 25 가운데 새로운 어플이 몇 개 올라왔는데,

법아! 놀자라는 어플은 그 중의 하나입니다.

말 그대로 일반 사람들에게 좀 어렵고 생소한 법을

받아들이기 쉽게, 재미있게 풀어낸 어플인데요.

저도 법에 대해서는 모르는 게 많은 사람인지라 관심이 가더군요.

어떤 사람은 이 어플을 보고,

'법아 놀자? 놀고 있네' 이렇게 받아들이기도 하더라구요.

좋은게 좋다고, 무료라는데, 한번 보기라도 하자구요!

법이라고 하면 좀 딱딱한 느낌인데, 어플의 아이콘을 일부러 그런 느낌을 지우려는 듯이

조금은 자유로운 듯한 필체로 법아, 놀자라고 써있네요 :)

법무부에서 만든 어플인듯합니다.

지킬수록 기분 좋은 기본!

네 가지 항목이 있습니다.

생활법률비타민, 퀴즈 솔로몬의 선택,

즐거운 로파크, 기분좋은 이벤트.!

한가지씩 알아보도로고 하죠!

먼저 생활법률 비타민입니다.

홈페이지의 FAQ 같은 역할을 하는데요.

일반적으로 궁금해할 질문들을 추려서 대답해준 메뉴입니다.

1번 Q.  전자발찌는 언제 착용하면 되나요에 대한 답변이 나와있습니다.

두번째 퀴즈, 솔로몬의 선택입니다.

그 중에서도 동화속 법률퀴즈.

정말 방송 솔로몬의 선택처럼 어떠한 상황을 주고,

그에 대한 O, X 답을 고르는 형식입니다.

동화속 법률퀴즈에서는 그 상황이 동화속의 상황인 셈이지요.

답을 고르면, 정답인지 오답인지 알려주고.

그에 대한 해설까지 해줍니다. 총 20문제 입니다.

이건 솔로몬의 선택 안에 있는 저작권 법률퀴즈입니다.

요즘 저작권이 문제가 많이 되죠?

저작권에 대한 기본상식을 알아두면 좋을 것 같습니다.

세번째 즐거운 로파크.

Law Park 라고 법을 좀 가볍게 알아보자라는 의미 같습니다.

여기에도 세가지 메뉴가 있습니다.

웹툰.

UCC

동영상까지!!

그리고 마지막으로 법무부에서 진행하는 이벤트까지..

사실 이 어플 자체가 아주 재미나거나 엄청나게 중요한 정보를 담고 있지는 않지만,

어린아이들에게 법에 대한 기본적인 지식을 재미있게 알려주긴 좋을 것 같습니다.

보시면 이벤트 선물도 초등학교 5~6학년을 대상으로 하고 있군요;;

그렇지만, 어른들이 봐도, 좋은 저작권 정보나 간단한 법상식 같은 것도 담고 있어서.

장기보관용 어플은 아니지만, 한번쯤 봐둬도 좋을 것 같습니다.

 



출처 : http://blog.naver.com/PostView.nhn?blogId=mytelelink&logNo=20104911442
Posted by 오늘마감
오브젝트C2010.06.21 18:29
인터페이스 및 메소드 생성에 대한 호출

코코아 프로그래밍 개정판의 첫번째 예제를 따라해 보면서 나름 대로 주석을 달아 보면서 설명을 직접해 보았다.

설명을 제대로 하고 있는지는 나 자신도 확신이 가지 않는다.

하지만 다른 사람에게 설명을 할 수 있는 수준이라면 나름대로 이해를 했다고 말할 수 있을 것이다.


objective-c는 c언어를 포함한 언어 이기 때문에 금방 배울수 있다는 생각을 가지고 있던 본인으로서는 상당히 당혹스러움을 감추지 못한 것이 사실이다. 

C++의 클래스 및 상속에 대한 기본 개념을 먼저 학습하고 다시 objective-c를 봐야 했기 때문이다.

그리고, objective-c만의 독창적인 문법에 대해서도 생소하여 기본 문법을 알아 보는데도 한참의 시간을 보냈다.

또한 단순히 xcode IDE를 이용하여 프로그래밍을 하면 된다는 생각을 하였으나 interface-builder의 사용법도 별도로 알아야 한다.

좀더 친숙해 지려면 많이 해 보는 것이 정답인 것 같다.

 



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

티스토리 툴바