2009-05-27 7 views
9

나는 객관적인 C를 처음 접했고 인스턴스 변수를 선언 할 때 포인터를 사용할시기와 사용하지 않을 때에 대한 일반적인 설명을 원했다.Objective-C 인스턴스 변수 포인터

내가 생각할 수있는 예는 UIView 대 BOOL입니다. UIView 나는 포인터를 만들 것이고, 나는 컴파일러가 내게 소리 쳤기 때문에 그렇게하지 않을 것이다.

일반적인 안내는 매우 좋습니다.

건배,

답변

20

포인터 표기법을 사용합니다. 는 C 유형 (INT, BOOL, 긴, 등)의 모든 개체 수 없습니다 당신은 자신의 메모리 위치에 대한 포인터를 원하는 경우에 따라서 당신은 단지 포인터를 사용

NSObject *obj; 
UIView<Protocol> *obj; 
int integerVar; 
BOOL isTrue; 

특별한 경우가 id이며, 그 자체입니다

id obj; 

약간 까다로운 : 객체에 대한 포인터, 그래서 당신은 * 필요하지 않습니다

NSInteger int; 
NSNumber *number; 

NSInteger 해당 플랫폼 별 INT 타이입니다 pe, NSNumber는 int, float 또는 무엇을 가질 수있는 객체입니다.

+2

답장을 보내 주셔서 감사합니다. 이제 C 유형이 메모리에서 정리되는 방법에 대해 묻습니다. 그것은 Objective-C 두드러기하에 수행됩니까? – Meroon

+1

개체의 인스턴스 변수가 모두 개체의 메모리 내에 포함되어 있습니다. 객체의 메모리가 해제되면 모두 사라집니다. 객체 유형 변수와의 차이점은 포인터라는 점입니다. 즉 변수 자체가 메모리의 특정 위치를 가리키고 있음을 의미합니다. 포인터 변수가 사라지더라도 포인터가 가리키는 메모리는 여전히 할당됩니다. – Chuck

+2

헤더 파일에서 때때로 포인터를 사용하여 구조체를 참조하는 구조체에 대해 typedef를 설정한다는 것을 잊지 마십시오. 이 경우 이름은 "Ref"로 끝납니다. 예 : CGImage *의 typedef 인 CGImageRef. 변수 이름에 *를 넣지 않은 것을 볼 때. – U62

5

포인터는 할당 된 메모리의 주소를 저장하는 데 사용됩니다. 코코아에서 객체를 만들 때 메모리를 할당하고 주소를 포인터에 저장합니다.

BOOL, char, int 값을 저장하십시오.

당신이 그것을 액세스 할 수 있도록 해당 메모리에 대한 포인터를 저장해야하므로 당신이 ALLOC 메모리를 할당하는 클래스를 만들기 : C 타입 메모리에서 청소합니까 어떻게

NSMutableArray * arr = [[NSMutableArray alloc] init]; 

?

'단순'유형이 스택에 할당됩니다. 메서드가 호출되면 스택에 모든 메서드 변수 (매개 변수 및 반환 주소 등)를 포함하는 공간이 할당됩니다. 그래서 스택이 커집니다. 메소드가 스택을 축소하면 메소드가 사용했던 공간이 줄어들고 이제는 단순한 유형이 '정리'됩니다.

실제로 소리보다 훨씬 간단합니다. 당신의 호기심을 만족시키는 더 자세한 정보는 wikipedia Stack entry - section Hardware stacks을보십시오.

메모리를 할당하면 메모리가 힙에 할당됩니다. 힙은 응용 프로그램의 전체 실행을위한 것입니다. 일단 힙에 메모리를 할당하면 해당 메모리에 주소가 생깁니다. 포인터에이 주소를 저장합니다. 포인터는 메모리 주소를 저장하는 변수 일뿐입니다.

메소드가 반환되면 메서드 내에서 선언 된 '단순한'변수 (예 : BOOL, int, char 등)에 액세스 할 수 없지만 힙의 메모리는 여전히 존재합니다. 메모리 주소 (예 : 포인터)가 있으면 해당 주소에 액세스 할 수 있습니다.

'단순'유형의 인스턴스 변수는 무엇입니까 (편집 : 내부 객체입니까?)?

개체를 만들 때 (여기서 객관적인 C와 Cocoa에 대해 이야기하고 있습니다) 할당하면 개체 전체에 공간이 할당됩니다.오브젝트의 크기는 모든 변수의 크기입니다 (obj-c가 다른 항목을 추가하는지 확실하지 않음). 따라서 인스턴스 변수는 힙에있는 객체 메모리의 일부입니다. 객체를 해제/삭제할 때 메모리가 회수되고 더 이상 객체 내부에 저장된 변수에 액세스 할 수 없습니다 (객체를 호출하면 obj-c에서 각 객체는 참조 횟수를 유지합니다. 참조 횟수가 0이되면 객체 할당이 해제됩니다. 힙의 메모리가 회수됩니다).

+0

오케이, 메서드의 범위 내에서 로컬 변수에 대한 감각을가립니다. 하지만 '단순한'유형의 인스턴스 변수는 무엇입니까? – Meroon

1

NSString, NSObject, NSView 등과 같은 모든 Objective-C 클래스는 NSUInteger와 같은 몇 가지 특수한 유형을 제외하고는 포인터가되어야합니다. 이것은 int의 typedef입니다.

NSString *stringyString = @"THIS STRING IS STRINGY!!!11"; 
NSOpenPanel *openPanel; 
NSObject *objectyObject; 
NSUInteger integeryInteger = 7; 

모든 개체에 대한 포인터이기 때문에 id가 아닌 유일한 것은 id입니다.

id pointerThatCanBeSetToAnyObject = [NSString stringWithString:@"HEYYYY"]; 

char 배열과 같은 C 문자열을 제외하고는 int, float, BOOL 등의 C 변수 유형에만 포인터가 필요하지 않습니다.

int SEVEN = 7; 
float SIXPOINTTWO = 6.2; 
char *characterArray = "HEYYYYY"; 

마지막으로 CoreFoundation 클래스에는 일종의 하이브리드가 있습니다. 많은 클래스들이 포인터가 될 것이지만, CFString과 같은 몇몇 클래스들에 대해서는 CFStringRef가 이미 포인터가 될 것입니다. 많은 CFString 함수가 CFStringRef로 반환됩니다. CFString *과 CFStringRef는 NSString *과 교환 가능합니다 (이것은 무료 전화 브리징이라고합니다). 컴파일러는 먼저 캐스트하면 그것을 높이 평가합니다.

CFString *veryStringyString = @"STRINGYNESS!!11!one"; 
CFStringRef especiallyStringyString = @"STRRRRRRINNNNNGGGGYYYYY"; 
NSString *STRINGYNESS = (NSString *)veryStringyString;