u Associative References

n  용도

기존의 클래스오브젝트의 인스턴스변수를 의사적으로 추가

Associative ReferencesMac OS X v10.6이후 에서만 사용 가능

 

n  Adding Storage Outside a Class Definition

클래스 선언을 변경하지않고 오브젝트에 스토리지를 추가 가능

클래스 소스코드에 접근 불가한 경우에 사용 가능

 

n  Creating Associations

런타임 함수 objc_setAssociatedObject를 사용

objc_setAssociatedObject 4개의 인수가 필요 (소스오브젝트, , , 폴리시정수)

(void포인터) : static변수를 사용하는 것이 일반적

폴리시정수 : 관련오브젝트를 대입할것인지, 유지할것인지, 복사할것인지를 지정

static char overviewKey;

NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];

NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];

objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);

[overview release];

// (1) overview valid

[array release];

// (2) overview invalid

 

 

n  관련 오브젝트의 취득

NSString *associatedObject = (NSString *)

objc_getAssociatedObject(array,&overviewKey);

 

n  Breaking Associations

objc_setAssociatedObject(array, &overviewKey, nil,

OBJC_ASSOCIATION_ASSIGN);

 

 

 

Posted by 김반장78
,

u 카테고리와 확장

n  의미

기본은 수직상속만 가능, 메소드를 추가해야할 경우 수직상속

카테고리를 사용함으로서 메소드의 수평적 상속이 가능

소스를 가지고 있는 않은 클래스에도 추가할 수 있음

카테고리를 사용해서 클래스의 implementation을 여러 파일로 쪼갤 수 있음

선언과 구현이 분리되어 있고, 클래스에 종속되어 있지 않음

 

n  Adding Methods to Classes

카테고리가 클래스에 추가한 method들은 클래스의 subclass 의해 상속

#import "ClassName.h"
 
@interface ClassName ( CategoryName )
// method declarations

@end

             -특징

               파일명이 ClassName+CategoryName.m으로 됨

#import "ClassName+CategoryName.h"
 
@implementation ClassName ( CategoryName )
// method definitions

@end

               오직 method 추가할 있음

               클래스 scope 모든 instance variables(@private조차도) 카테고리의 scope이므로

모두 접근이 가능

무한정 작성 가능

 

n  How you Use Categories

다른 implementation 의해 정의된 클래스들을 확장할

Cocoa frameworks 정의된 클래스들에 method들을 추가할

             subclass 대안으로 쓰려고

             클래스의 implementation 개의 소스 화일로 분배하려

             informal protocol 선언하기 위해

 

n  Categories of the Root Class

super 대한 message 가능

class object 루트 클래스에 정의된 instance method 수행할 있다

             보통 class object class method 수행하지만 루트 클래스에 정의된 instance method

특별한 경우이다.

카테고리로 추가한 instance method가 루트 클래스에서 수행되므로 예측이 불가능하게 되어 루트

클래스에 카테고리 사용은 바람직하지 못하다.

Posted by 김반장78
,