반응형
Objective-C 고급 ( Advanced Objective-C )
출처 : http://www.tutorialspoint.com/objective_c/objective_c_classes_objects.htm
<< Classes/Objects >>
-
class 는 @interface 와 @implementation 의 두 파트로 나뉘어 정의된다.
-
대부분이 objects 를 상속한다.
-
objects 는 메세지를 받기 때문에 receiver 로 불리기도 한다.
-
Properties 는 다른 class 에서의 access 를 접근하도록 도와준다.
-
ex)
@interface Box:NSObject
{
double length;
double breadth;
}
@property(nonatomic, readwrite) double height;
@end
-
Objective-C object 를 allocate 하고 initializing 하는 것은 다음과 같이 한다.
Box box1 = [[Box alloc]init];
-
data member 접근은 . 을 이용해 바로 접근한다.
@interface Box:NSObject
{
double length;
double breadth;
double height;
}
@property(nonatomic, readwrite) double height;
-(double) volume;
@end
@implementation Box
@synthesize height;
-(id) init
{
self = [super init];
length = 1.0;
breath = 1.0;
return self;
}
-(double) volume
{
return length*breadth*height;
}
@end
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
Box *box1 = [[Box alloc]init];
double volume = 0.0;
box1.height = 5.0;
volume = [box1 volume];
[pool drain];
return 0;
}
-
Properties
property 는 class 의 변수를 다른 class 에서 접근할 수 있다는 것을 명시한다.
(properties 로 명시한다는것은 내부적으로 getter, setter 가 생긴다는 것을 의미한다.)
@property 라는 키워드로 명시하며, access specifier 가 따라온다.
그 다음은 data type 과 property name 을 명시해준다.
access specifier 는 nonatomic or atomic, readwrite or readonly,. strong or unsafe_unretained or weak 중 필요한 것을 명시한다.
pointer type 에는 string, unsafe_unretained, 또는 weak 을 명시한다.
implementation 구분에서는 synthesize 를 이용해서 이를 명시해준다.
( 최신 XCode 에서는 synthesize 가 필요 없다고 한다.. )
<< Inheritance >>
-
Base class 하나만 상속 가능하기에, multilevel inheritance 를 사용해야 한다.
모든 class 는 NSObject 를 상속한다.
@interface derived-class : base-class
-
subclass 는 super class 의 interface에 정의된 모든 private member 에 접근 가능하다. ( extension 으로 뭔가 처리하지 않는 한 )
<< Polymorphism >>
-
기본 Java 와 동일하다.
<< Data Encapsulation >>
-
interface 안에 정의되는 변수들은 private access.
interface 안에 정의되는 함수들은 public access 이다.
private method 는 interface 에 정의하지 않고, implementation 에만 정의하면 된다.
<< Categories >>
-
기존에 존재하는 class 에 어떤 method 를 추가하고 싶다면 category 를 이용하면 된다.
category 는 @interface 키워드를 통해 정의할 수 있다.
@interface ClassName ( CategoryName )
@end
-
Category 는 original impl code 가 없어도, 어떤 class 를 위해서든 정의될 수 있다.
category 에 정의한 함수들은 original class 의 모든 instance 에서 접근 가능하다. sub class 도 물론이다.
Runtime 에는 category 에 의해 추가된 함수와 원래 있는 함수와 사용상의 차이가 없다.
사용할 때는 category 의 header file 을 import 해주어야 한다.
-
ex)
@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end
@implmenetation NSString(MyAdditions)
+(NSString *)getCopyRightString{
return @"Copyright";
}
@end
int main(int argc, const char* argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@", copyrightString);
[pool drain];
return 0;
}
<< Posing >>
-
OSX 10.5 부터 deprecated 되었다.
-
Object 에 있는 poseAsClass: 메소드를 이용하여 어떤 class 의 역할 자체를 user define 한 것으로 바꾸는 녀석이다.
<< Extensions >>
-
category 와 다르게 extension 은 compile 타임에 source 를 가지고 있는 경우에만 사용할 수 있다.
Extension 은 category name 이 없는 category 라고 볼 수 있다.
그래서 anonymous category ( 익명 카테고리 ) 라고도 불린다.
-
다음의 syntax 를 가진다.
@interface ClassName()
@end
-
extension 으로는 private variable 과 private method 를 추가할 수 있다.
extension 안에 정의한 method 와 variable 은 상속받은 class 들이 접근할 수 없다.
<< Protocols >>
-
protocol 의 syntax 는 아래와 같다.
@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end
-
Java 의 interface 와 같은 개념으로 아래와 같이 사용한다. 여러 개의 protocol 을 받아 들이려면 , 로 separation 한다.
@interface MyClass :NSObject <MyProtocol>
...
@end
<< Dynamic Binding >>
-
dynamic binding 은 compile time 이 아닌 runtime 에 호출할 method 를 결정하는 것을 말한다.
late binding 이라고도 한다.
-
Objective-C 에서는 모든 method 가 runtime 에 dynamical 하게 정해진다.
코드 실행은 method name 과 receiving object 에 의해 결정된다.
dynamic binding 은 polymorphism 을 가능하게 한다.
-
ex)
@interface Square:NSObject
{
float area;
}
- (void) printArea;
@end
@implementation Square
- (void) printArea
{
NSLog(@"square %d", area);
}
@end
@interface Rectangle:NSObject
{
float area;
}
- (void) printArea;
@end
@implementation Rectangle
- (void) printArea
{
NSLog(@"rectangle %d", area);
}
@end
int main()
{
Square *square = [[Square alloc]init];
Rectangle *rectangle = [[Rectangle alloc]init];
NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle, nil];
id object1 = [shapes objectAtIndex:0];
[object1 printArea];
id object2 = [shapes objectAtIndex:1];
[objectt2 printArea];
return 0;
}
<< Composite Objects >>
-
Class Cluster 는 여러개의 비슷한 성질의 것들을 한 class 에 넣어 관리하는 것을 얘기한다.
예를 들어 NSNumber 는 char, int, bool 등의 클래스들의 cluster 를 가지고 있다고 말할 수 있다.
-
기본적인 composite 개념은 같으나, 여기서는 참조를 갖는게 아닌 상속을 받는 것을 이야기한다.
ex)
@interface ValidatingArray:NSMutableArray
{
NSMutableArray *embeddedArray;
}
+ validatingArray;
- init;
- (unsigned)count;
...
@end
@implementation ValidatingArray
-init
{
self = [super init]
if (self){
embeddedArray = [[NSMuttableArray allocWithZone:[self zone]] init];
}
return self;
}
+validatingArray
{
return [[self alloc]init];
}
- (unsigned) count
{
return [embeddedArray count];
}
@end
...
<< Foundation Framework >>
-
NS 는 NeXTStep 에서 왔기에..
-
NSObject 는 memory 관리도 하고 기본 interface 역할도 하며, Object 자체의 역할도 한다.
-
Data Storage
* NSArray & NSMutableArray
* NSDictionary & NSMutableDictionary
* NSSet & NSMutableSet
-
Text and strings
* NSCharacterSet
-
Dates and Times
* NSDate & NSDateFormatter
-
Exception Handling
* @try
* @catch
* @finally
-
URL loading System
* NSMutableURLRequest
* NSURLConnection
* NSURLCache
* NSURLAuthenticationChallenge
* NSURLCredential
* NSURLProtectionSpace
* NSURLResponse
* NSURLDownload
* NSURLSession
<< Fast Enumeration >>
-
collection 을 빠르게 enumerating 할 수 있다. ( for-each 문 성격 )
-
아래와 같은 syntax 를 갖는다.
for ( classType variable in collectionObject )
{
...
}
-
backward fast enumeration 은
for( classType variable in [collectionObject reverseObjectEnumerator] )
{
...
}
<< Memory Management >>
-
Objective-C 는 두 가지 형태의 메모리 관리 기술로 구분된다.
1. Manual Retain-Release or MPR
2. Automatic Reference Counting or ARC
-
MPR ( Manual Retain-Release )
메모리를 우리가 직접 alloc 하고 추적하다가 release 까지 하는 것.
alloc/init 하는 순간 retain count = 1
retain 을 호출하면 retain count++
release 를 호출하면 retain count--
retain count 가 0 이 되면 destroy 된다.
-
MPR 의 기본 rule 은
alloc, new, copy, mutableCopy 등을 이용해 object 를 만든다.
retain 을 통해 ownership 을 갖는다.
release 를 통해 ownership 을 포기 ( ownership 을 안 가지고 있는데 호출하면 안 된다. )
-
ARC ( Automatic Reference Counting )
MPR 과 같은 reference counting system 을 사용한다.
compile time 에 memory management method call 을 추가함으로써 자동으로 메모리 관리가 된다.
새로운 프로젝트에는 ARC 를 사용하는 것이 좋다.
-
자동 메모리 관리가 되기 때문에 retain, release 함수들을 호출해줄 필요가 없다.
따라서 가독성도 높여주고, 에러 확률도 줄여주며, 토드 양도 줄어들고, 메모리 릭도 적어진다.
-
GC 개념이 있었는데 OS-X Mountain Lion 부터 deprecated 되었다. ( MPR 과 관련 )
iOS 의 경우에는 GC 개념이 아예 없었다.
ARC 에서 사용하는 것은 GC 가 아니다.
출처 : http://www.tutorialspoint.com/objective_c/objective_c_classes_objects.htm
<< Classes/Objects >>
-
class 는 @interface 와 @implementation 의 두 파트로 나뉘어 정의된다.
-
대부분이 objects 를 상속한다.
-
objects 는 메세지를 받기 때문에 receiver 로 불리기도 한다.
-
Properties 는 다른 class 에서의 access 를 접근하도록 도와준다.
-
ex)
@interface Box:NSObject
{
double length;
double breadth;
}
@property(nonatomic, readwrite) double height;
@end
-
Objective-C object 를 allocate 하고 initializing 하는 것은 다음과 같이 한다.
Box box1 = [[Box alloc]init];
-
data member 접근은 . 을 이용해 바로 접근한다.
@interface Box:NSObject
{
double length;
double breadth;
double height;
}
@property(nonatomic, readwrite) double height;
-(double) volume;
@end
@implementation Box
@synthesize height;
-(id) init
{
self = [super init];
length = 1.0;
breath = 1.0;
return self;
}
-(double) volume
{
return length*breadth*height;
}
@end
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
Box *box1 = [[Box alloc]init];
double volume = 0.0;
box1.height = 5.0;
volume = [box1 volume];
[pool drain];
return 0;
}
-
Properties
property 는 class 의 변수를 다른 class 에서 접근할 수 있다는 것을 명시한다.
(properties 로 명시한다는것은 내부적으로 getter, setter 가 생긴다는 것을 의미한다.)
@property 라는 키워드로 명시하며, access specifier 가 따라온다.
그 다음은 data type 과 property name 을 명시해준다.
access specifier 는 nonatomic or atomic, readwrite or readonly,. strong or unsafe_unretained or weak 중 필요한 것을 명시한다.
pointer type 에는 string, unsafe_unretained, 또는 weak 을 명시한다.
implementation 구분에서는 synthesize 를 이용해서 이를 명시해준다.
( 최신 XCode 에서는 synthesize 가 필요 없다고 한다.. )
<< Inheritance >>
-
Base class 하나만 상속 가능하기에, multilevel inheritance 를 사용해야 한다.
모든 class 는 NSObject 를 상속한다.
@interface derived-class : base-class
-
subclass 는 super class 의 interface에 정의된 모든 private member 에 접근 가능하다. ( extension 으로 뭔가 처리하지 않는 한 )
<< Polymorphism >>
-
기본 Java 와 동일하다.
<< Data Encapsulation >>
-
interface 안에 정의되는 변수들은 private access.
interface 안에 정의되는 함수들은 public access 이다.
private method 는 interface 에 정의하지 않고, implementation 에만 정의하면 된다.
<< Categories >>
-
기존에 존재하는 class 에 어떤 method 를 추가하고 싶다면 category 를 이용하면 된다.
category 는 @interface 키워드를 통해 정의할 수 있다.
@interface ClassName ( CategoryName )
@end
-
Category 는 original impl code 가 없어도, 어떤 class 를 위해서든 정의될 수 있다.
category 에 정의한 함수들은 original class 의 모든 instance 에서 접근 가능하다. sub class 도 물론이다.
Runtime 에는 category 에 의해 추가된 함수와 원래 있는 함수와 사용상의 차이가 없다.
사용할 때는 category 의 header file 을 import 해주어야 한다.
-
ex)
@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end
@implmenetation NSString(MyAdditions)
+(NSString *)getCopyRightString{
return @"Copyright";
}
@end
int main(int argc, const char* argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@", copyrightString);
[pool drain];
return 0;
}
<< Posing >>
-
OSX 10.5 부터 deprecated 되었다.
-
Object 에 있는 poseAsClass: 메소드를 이용하여 어떤 class 의 역할 자체를 user define 한 것으로 바꾸는 녀석이다.
<< Extensions >>
-
category 와 다르게 extension 은 compile 타임에 source 를 가지고 있는 경우에만 사용할 수 있다.
Extension 은 category name 이 없는 category 라고 볼 수 있다.
그래서 anonymous category ( 익명 카테고리 ) 라고도 불린다.
-
다음의 syntax 를 가진다.
@interface ClassName()
@end
-
extension 으로는 private variable 과 private method 를 추가할 수 있다.
extension 안에 정의한 method 와 variable 은 상속받은 class 들이 접근할 수 없다.
<< Protocols >>
-
protocol 의 syntax 는 아래와 같다.
@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end
-
Java 의 interface 와 같은 개념으로 아래와 같이 사용한다. 여러 개의 protocol 을 받아 들이려면 , 로 separation 한다.
@interface MyClass :NSObject <MyProtocol>
...
@end
<< Dynamic Binding >>
-
dynamic binding 은 compile time 이 아닌 runtime 에 호출할 method 를 결정하는 것을 말한다.
late binding 이라고도 한다.
-
Objective-C 에서는 모든 method 가 runtime 에 dynamical 하게 정해진다.
코드 실행은 method name 과 receiving object 에 의해 결정된다.
dynamic binding 은 polymorphism 을 가능하게 한다.
-
ex)
@interface Square:NSObject
{
float area;
}
- (void) printArea;
@end
@implementation Square
- (void) printArea
{
NSLog(@"square %d", area);
}
@end
@interface Rectangle:NSObject
{
float area;
}
- (void) printArea;
@end
@implementation Rectangle
- (void) printArea
{
NSLog(@"rectangle %d", area);
}
@end
int main()
{
Square *square = [[Square alloc]init];
Rectangle *rectangle = [[Rectangle alloc]init];
NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle, nil];
id object1 = [shapes objectAtIndex:0];
[object1 printArea];
id object2 = [shapes objectAtIndex:1];
[objectt2 printArea];
return 0;
}
<< Composite Objects >>
-
Class Cluster 는 여러개의 비슷한 성질의 것들을 한 class 에 넣어 관리하는 것을 얘기한다.
예를 들어 NSNumber 는 char, int, bool 등의 클래스들의 cluster 를 가지고 있다고 말할 수 있다.
-
기본적인 composite 개념은 같으나, 여기서는 참조를 갖는게 아닌 상속을 받는 것을 이야기한다.
ex)
@interface ValidatingArray:NSMutableArray
{
NSMutableArray *embeddedArray;
}
+ validatingArray;
- init;
- (unsigned)count;
...
@end
@implementation ValidatingArray
-init
{
self = [super init]
if (self){
embeddedArray = [[NSMuttableArray allocWithZone:[self zone]] init];
}
return self;
}
+validatingArray
{
return [[self alloc]init];
}
- (unsigned) count
{
return [embeddedArray count];
}
@end
...
<< Foundation Framework >>
-
NS 는 NeXTStep 에서 왔기에..
-
NSObject 는 memory 관리도 하고 기본 interface 역할도 하며, Object 자체의 역할도 한다.
-
Data Storage
* NSArray & NSMutableArray
* NSDictionary & NSMutableDictionary
* NSSet & NSMutableSet
-
Text and strings
* NSCharacterSet
-
Dates and Times
* NSDate & NSDateFormatter
-
Exception Handling
* @try
* @catch
* @finally
-
URL loading System
* NSMutableURLRequest
* NSURLConnection
* NSURLCache
* NSURLAuthenticationChallenge
* NSURLCredential
* NSURLProtectionSpace
* NSURLResponse
* NSURLDownload
* NSURLSession
<< Fast Enumeration >>
-
collection 을 빠르게 enumerating 할 수 있다. ( for-each 문 성격 )
-
아래와 같은 syntax 를 갖는다.
for ( classType variable in collectionObject )
{
...
}
-
backward fast enumeration 은
for( classType variable in [collectionObject reverseObjectEnumerator] )
{
...
}
<< Memory Management >>
-
Objective-C 는 두 가지 형태의 메모리 관리 기술로 구분된다.
1. Manual Retain-Release or MPR
2. Automatic Reference Counting or ARC
-
MPR ( Manual Retain-Release )
메모리를 우리가 직접 alloc 하고 추적하다가 release 까지 하는 것.
alloc/init 하는 순간 retain count = 1
retain 을 호출하면 retain count++
release 를 호출하면 retain count--
retain count 가 0 이 되면 destroy 된다.
-
MPR 의 기본 rule 은
alloc, new, copy, mutableCopy 등을 이용해 object 를 만든다.
retain 을 통해 ownership 을 갖는다.
release 를 통해 ownership 을 포기 ( ownership 을 안 가지고 있는데 호출하면 안 된다. )
-
ARC ( Automatic Reference Counting )
MPR 과 같은 reference counting system 을 사용한다.
compile time 에 memory management method call 을 추가함으로써 자동으로 메모리 관리가 된다.
새로운 프로젝트에는 ARC 를 사용하는 것이 좋다.
-
자동 메모리 관리가 되기 때문에 retain, release 함수들을 호출해줄 필요가 없다.
따라서 가독성도 높여주고, 에러 확률도 줄여주며, 토드 양도 줄어들고, 메모리 릭도 적어진다.
-
GC 개념이 있었는데 OS-X Mountain Lion 부터 deprecated 되었다. ( MPR 과 관련 )
iOS 의 경우에는 GC 개념이 아예 없었다.
ARC 에서 사용하는 것은 GC 가 아니다.
반응형
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
iOS Simulator Home 버튼이 보이지 않아요. (0) | 2015.06.30 |
---|---|
illegal configuration launch screens may not have connections (0) | 2015.06.20 |
Objective-C 의 기본 ( Basic Objective-C ) (0) | 2015.06.16 |
Xcode Line Delete Shortcut ( 라인 삭제 단축키 ) (0) | 2015.06.02 |
[ios] View Controller 간의 transition control 하기. (0) | 2012.11.05 |
댓글