오브젝트C2011.04.09 10:46
커널패닉 채널에서 peniar님과 xcode 예기를 하다가 xcode가 gcc를 사용한다는 소리를
듣고서 gcc를 사용한다면 리눅스에서도 obj-c 개발 환경 구성이 가능하지 않을까 싶어
검색해보았습니다.

참고한 사이트 :: [ http://ubuntuforums.org/showthread.php?t=1064045 ]

우분투 리눅스에서는 obj-c 관련 패키지가 gobjc더군요

$sudo apt-get install gobjc

하시게되면 관련 패키지가 여럿 설치가 됩니다.

objc 소스코드를 컴파일 하는 방법은
$gcc -o -Wall 실행파일 소스코드.m -lobjc

편집기로 vim을 사용하시는 분은 .vimrc 파일에 key mapping을 통해서 
vim 내에서 컴파일이 가능하게 할 수 있습니다.

.vimrc 파일 설정
filetype on
au FileType objc map <F2> : !gcc -o -Wall %< % -lobjc
au FileType objc map <F3> : !./%<


이렇게 지정 해두시면 F2를 누르면 컴파일, F3을 누르면 실행이 됩니다.

뭐 이렇게 설정한다고 해도 리눅스에서 아이폰/아이패드 개발이 가능한 것은 아닙니다 
흣 그저 간단히 obj-c 개발이 가능할 뿐이죠 =_=


출처 : http://blog.naver.com/PostView.nhn?blogId=nsjkim&logNo=140115657293
Posted by 오늘마감
오브젝트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 오늘마감
오브젝트C2010.10.12 13:04
[objective-c] Objective-C Tutorial: NSArray [영어주의]

Objective-C Tutorial: NSArray

Here at iCodeblog, we have been showing you guys how to create many different types of applications from the ground up.  Well, today I decided to do something different and get down to some of the nitty gritty of a structure we rely heavily on in objective-C.

The NSArray is a huge workhorse that we use quite frequently without even thinking about it.  The NSArray class isn’t just your ordinary array.  Not only does it provide random access, but it also dynamically re-sizes when you add new objects to it and has many methods to make our lives easier.  While I won’t go over every method in NSArray (there are quite a few), I will discuss some of the more important ones that are most commonly used.  Let’s take a closer look at this class.

Factory Methods

Factory methods are static methods that build new instances of NSArrays from given parameters and return them.  The table below details on all of the factory methods for the NSArray class.

+ (id)array Creates and returns an empty array
+ (id)arrayWithArray:(NSArray *)anArray Creates and returns an array containing the objects in another given array.
+ (id)arrayWithContentsOfFile:(NSString *)aPath Creates and returns an array containing the contents of the file specified by a given path. *The file must be of type .plist for this method to work
+ (id)arrayWithContentsOfURL:(NSURL *)aURL Similar to arrayWithContentsOfFile except it will load the .plist remotely from a given website. This would be a very simple way to get data from a web service.
+ (id)arrayWithObject:(id)anObject Creates and returns an array containing a given object. This will just be a 1 element array
+ (id)arrayWithObjects:(id)firstObj, … This method is used when you have multiple objects on hand and want easily insert them into an array. Make sure the last element you add is nil or this method won’t work.
+ (id)arrayWithObjects:(const id *)objects count:(NSUInteger)count Creates and returns an array that includes a given number of objects from a given C array.

Here is some example usage of building NSArrays with these factory methods…

// I am using strings, but you can add just about any object to an NSArray   // Creates an NSArray with one object NSArray * myArray = [NSArray arrayWithObject:@"foo"];   // Creates an NSArray with multiple objects. Don't forget to add nil as the last object NSArray * myArray2 = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];   // Creates an NSArray from another NSArray NSArray * myArray3 = [NSArray arrayWithArray:myArray2];   // This will create an NSArray from data on iCodeBlog. Go ahead and try it out, this file exists on our servers and contains valid data. NSArray * myArray4 = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:@"http://icodeblog.com/wp-content/uploads/2009/08/foo.plist"]];

You can also choose not to use factory methods and just use the normal NSArray initializers. They are pretty much the same as the factory methods only you do the allocation yourself. An example of this might be:

NSArray * foo = [[NSArray alloc] initWithObjects:@"foo",@"bar",@"baz",nil];

Accessing The NSArray

Apple has provided us with many great methods for getting data out of an NSArray as well as information about it.  Here is a table of methods and their descriptions.

- (BOOL)containsObject:(id)anObject Returns true if a given object is found in the array, false otherwise
- (NSUInteger)count Returns the size of the array
- (id)lastObject Returns the last object in the array (the one with the highest index)
- (id)objectAtIndex:(NSUInteger)index Gives you random access to the array. Returns the object at a given index.

These are just a few of the accessor methods of NSArray and most likely the only ones you will need to use.

Searching The Array

If you are looking for the index of an object in an array, there is really only one method you need to use. That method is indexOfObject: . An example of usage might be:

NSString * f = @"foo"; NSString * b = @"bar"; NSString * z = @"baz"; NSArray * myArray2 = [NSArray arrayWithObjects:f,b,z,nil]; NSInteger idx = [myArray2 indexOfObject:b]; // This would return 1 (since NSArrays are 0 - indexed)

This is much cleaner code than looping over the entire array to find an object. It’s probably more efficient too as Apple is pretty clean in how they code things.

Sending Message To Objects In The Array

Ok, so this is pretty cool.  Say you have an array of objects that all need to do something.  For example, an array of bullets, and you want all of the bullets to move forward one pixel. Rather than looping over each bullet object in the bullets array and calling [bullet move], you can do it in one method call on the array.  This method is called – (void)makeObjectsPerformSelector:(SEL)aSelector and here is an example of usage.

// Lets pretend the bullet object has a method called move // and there is an array of 50 bullets   [bullets makeObjectsPerformSelector:@selector(move)];
ADVERTISEMENT

 

And that’s it… The move method will now be called on every bullet object in the array with this one method call. Very clean and easy to use. Now, if the method you want to call takes an argument, there is the – (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)anObject method. This will allow you to pass an object to each method being called.

Sorting Arrays

Apple has provided us with some very slick ways to sort an NSArray. I will not go into too much detail here as I have a full tutorial planned dedicated to sorting arrays. For now, I will just show you how to sort an NSArray of NSStrings. The method we will be using is sortedArrayUsingSelector. Here is the example usage.

NSArray *sortedArray = [myArray2 sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; // This will return a sorted array that looks like [@"bar",@"baz",@"foo"]

You can plug in any of the string compare functions there to compare the strings. If you are sorting an NSArray of custom objects (like users), you can overwrite the compare method for that object and pass compare in for the selector. Just make sure you remember the : at the end of the method.

Looping Through Arrays

So if you are reading this, I assume you have seen a for loop before. ex: for(int x=0; x < … This would most likely not be a good way to enumerate an NSArray as Apple has provided a much nice way for doing so. There are some situations where this method would be preferred (like when u need to calculate the indices or something). But in most cases, you will want to use the special for loop provided by Apple. If you have ever coded PHP, it is much like the foreach loop. Here is an example:

for(NSString * myStr in myArray2) { NSLog(myStr); }

This will loop over myArray2 and pring each element in that array. Very clean and efficient.

Saving Arrays For Later

There is an Array of ways to save data on the iPhone (Pun intended). One way is to simply dump the array to a file. This will write out the NSArray to a plist file on disk that can be loaded later using the arrayWithContentsOfFile method of NSArray. That method is rightfully named writeToFile. The example usage for it is as follows.

NSArray * myArray2 = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil]; [myArray2 writeToFile:filePath atomically:YES];

And there you have it! You are probably wondering what the atomically variable means. Me too… Just kidding. If YES, the file will be written to a temp location and then renamed to its final destination. This is put in place to guarantee that the file won’t be corrupted even if the system crashes (rename will be much faster than write). Why is this needed you ask? Consider this scenario.

You want to write a huge array to disk to save it for later. When your app starts it checks the disk to see if this file exists, if it does it loads an NSArray from it. If it doesn’t it creates a new NSArray. Say the last time the app ran, the system crashed while the file was being written. If atomically was set to NO, the original file would be corrupt and now the application would be loading corrupt data every time it starts from now on (most likely causing a crash). However, if you set atomically to YES, the temp file would get corrupted and the app would never see it. That way, the next time the app starts it will create a new fresh NSArray and all will be good.

Good rule of thumb, set atomically to YES.

That concludes our tutorial on NSArray. If you have any questions or comments, feel free to post them in the comments section or write me on twitter.

This entry was posted in iPhone ArticlesiPhone Programming Tutorialsiphone and tagged . Bookmark the permalinkPost a comment or leave a trackback: Trackback URL.
Posted by 오늘마감
오브젝트C2010.10.12 04:55
[objective-c] 클래스 멤버변수를 hashmap사용때처럼 key로 사용.
모든 클래스는 NSObject를 상속받으며, 
모든 클래스의 멤버변수명은 key로 간주된다.
변수값이 value이다.

따라서 모든 객체의 멤버변수의 값을 얻기위해 멤버변수명을 키값으로해서 얻을 수 있겠다.
 NSDictionary처럼 모든객체를 딕셔너리처럼 사용할 수 있다.

class Student 의 멤버변수 myName이 있을때, 값이 "angel"이면

멤버변수값을 넣을때
[ student setValue:@"angel" forKey@"MyName"];
빼낼때
NSString *name= [student valueForKey:@"myName"];

Posted by 오늘마감
오브젝트C2010.10.12 04:53
[objective-c] self vs super 차이
슈퍼는 단순한 flag이다. 컴파일러에게 실행할 함수를 찾을때 어디서 시작해야하는지 알려주는것. 이것은 메세지의 리시버로서 사용된다.
self는 지역변수이다. 함수내부의 지역변수. 이것은 다양한 방식으로 사용될 수 있는데 심지어 값을 할당할 수도있다.
Posted by 오늘마감
TAG self, super, VS, 차이
오브젝트C2010.10.12 04:51
[objective-c] NSString split하기
<form name="search" action="http://www.idev101.com/search.html" method="POST">

Split a String into an Array

</form>

Split a string into an array of strings by using NSString's componentsSeparatedByString:

NSString *myString = @"This is a test"; NSArray *myWords = [myString componentsSeparatedByString:@" "]; // myWords is now: [@"This", @"is", @"a", @"test"]

If you need to split on a set of several different characters, use NSString's componentsSeparatedByCharactersInSet:

NSString *myString = @"Foo-bar/blee"; NSArray *myWords = [myString componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"-/"] ]; // myWords is now: [@"Foo", @"bar", @"blee"]

The separator string can't be blank. If you need to separate a string into its individual characters, just loop through the length of the string and convert each char into a new string:

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]]; for (int i=0; i < [myString length]; i++) { NSString *ichar = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]]; [characters addObject:ichar]; }

http://www.idev101.com/code/Objective-C/Strings/split.html
Posted by 오늘마감
오브젝트C2010.10.12 04:50
[objective-c] NSString 스트링포맷 와일드카드써서 파일명바꾸기

int month;


for(month=1;month<13;month++){

NSString *imageName = [NSString stringWithFormat:@"2010_%d.png", month];

}


Posted by 오늘마감
오브젝트C2010.10.12 04:48
[objective-c] Throwing and rethrowing an exception

Listing 1  Throwing and rethrowing an exception


@try {

 // ...

 if (someError) {

 NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];

 @throw theException;

 }

}

@catch (NSException *exception) {

 if ([[exception name] isEqualToString:MyAppException]) {

 NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil,

 localException);

 }

 @throw; // rethrow the exception

}

@finally {

 [self cleanUp];

}

In this code the exception (exception) is thrown again at the end of the local handler, allowing an encompassing exception handler to take some additional action. Figure 1 illustrates the flow of program control between nested exception handlers created with the @catch directive.

Figure 1  Control flow with nested exception handlers—using directives

An exception raised within Method 3's domain causes execution to jump to its local exception handler. In a typical application, this exception handler queries the exception object to determine the nature of the exception. The local handler may handle exception types that it recognizes and then may rethrow the exception object to pass notification of the exception to the handler nested above it—that is, the handler in Method 2. However, before the next outer exception handler is invoked, the code in the @finally block associated with the local exception handler is executed. (This has implications for memory management, as discussed in “Exception Handling and Memory Management .”)

An exception that is rethrown appears to the next higher handler just as if the initial exception had been raised within its own exception handling domain. Method 2's exception handler again may handle the exception and may rethrow the exception to Method 1's exception handler; Method 1’s handler does not receive the rethrown exception until Method 2’s @finally block completes its task. Finally, Method 1’s handler rethrows the exception. Because there is no exception handling domain above Method 1, the exception passes to the uncaught exception handler (see “Uncaught Exceptions”).

Nested Exception Handlers With Exception Macros

You program should use the exception-handling macros if it must be compatible with versions of the operating system prior to Mac OS X v10.3. If you are using the exception-handling macros, the code equivalent to that in Listing 1 would look something like Listing 2.

Listing 2  Raising and re-raising an exception


NS_DURING

 ...

 if (someError) {

 NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];

 [theException raise];

 }

 [self cleanUp];

NS_HANDLER

 if ([[localException name] isEqualToString:MyAppException]) {

 NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil,

 localException);

 }

 [self cleanUp];

 [localException raise]; /* Re-raise the exception. */

NS_ENDHANDLER

In this code the exception (exception or localException) is raised again at the end of the local handler, allowing an encompassing exception handler to take some additional action. Figure 2 illustrates the use of nested exception handlers, and is discussed in the text that follows.

Figure 2  Control flow with nested exception handlers—using macros

An exception raised within Method 3’s domain causes execution to jump to its local exception handler. In a typical application, this exception handler checks the object localException to determine the nature of the exception. For exception types that it recognizes, the local handler responds and then may send raise to localException to pass notification of the exception to the handler above, the handler in Method 2. (An exception that is re-raised appears to the next higher handler just as if the initial exception had been raised within its own exception handling domain.) Method 2’s exception handler does the same and then re-raises the exception to Method 1’s handler. Finally, Method 1’s handler re-raises the exception. Since there is no exception handling domain above Method 1, the exception is transferred to the uncaught exception handler (see “Uncaught Exceptions”).

Posted by 오늘마감
오브젝트C2010.10.12 04:46
[objective-c] Objective-C Tutorial: NSArray

Objective-C Tutorial: NSArray

Posted by 오늘마감
오브젝트C2010.10.12 04:44
[objective-c] Overriding NSObject Description Method

Overriding NSObject Description Method

Posted by 오늘마감