2011-12-22 3 views
0

목표 C를 처음 접했고 여기에 혼란이 있습니다.목표 C : 메모리 할당

인스턴스에 메모리를 할당하는 데는 언제 적용 할 수 있습니까? 이처럼 :

가 적용이를 사용하는 것입니다 ...

NSString *str = [[NSString alloc]init]; 

이를 사용하는 ...

- (NSString *) formatStr:(NSString *) str{ 
    NSString *str = (NSString *) str; 
... 
..... 
....... 
} 

심지어 UIActionSheet를 만들기를, 다른 UI에 ALLOC를 사용하지만 요소가 아니라면 ...

정확한 이유는 언제입니까?

감사 친구들 .. : D

답변

2

(즉 [[MyClass alloc] init] 통해) 어떤 클래스이므로 "공장 메소드"라고 제공 결제. 내부적으로 객체를 할당하는 클래스 메소드입니다. 팩토리 메소드를 사용하면 (자), 호출 원에게 돌아갈 적절한 서브 클래스를 작성할 수있는 이점이 있습니다. 두 경우 모두 할당은 궁극적으로 alloc/init입니다.

0

C의 ALLOC 방법은 메모리를 할당 핸들 목적, 그냥 유지 및 릴리스 사이클을 관리, 할당에 대해 걱정할 필요가 없습니다.

"정상적인"할당 경로 이외에이 About Memory Management article from Apple

0

alloc + init을 사용하여 인스턴스를 만들거나 이름에 init (예 : initWithString)이있는 메소드를 통해 인스턴스를 얻는 경우 사용자가 객체를 소유하고 있다고 말하면이 인스턴스를 유지하면 안됩니다 (ref 카운터는 이미 1로 설정되어 있습니다.) 작업이 끝나면 결국 그것을 해제해야합니다. 이름을 초기화하지 않은 메소드를 호출하여 인스턴스를 수신하면 (즉, 규칙은 있지만 문서를 항상 확인해야 함) 이는 사용자가 객체의 소유자가 아니라는 것을 의미합니다. 즉, 객체는 언제든지 해제 될 수 있습니다 심지어 당신이 그것을 사용하는 동안. 일반적으로 stringWithFormat과 같은 메서드는 이벤트주기가 끝날 때까지 (문자열에서 retain을 호출하여 소유권을 주장하지 않는 한) 자동 완성 된 객체를 반환합니다. 난 강력하게 pencho cocoa memory management guide.

NSString *str = [[NSString alloc]init]; //you own the object pointed to by str. Its retain count is 1. If you don't call release this will be a memory leak. 


- (NSString *) formatStr:(NSString *) str{ 
    NSString *str = (NSString *) str; //you don't own str. btw, you don't need casting here 
//using str here might throw exception if its owner has released it 
    [str retain]; //you own str now. you can do whatever you want with it. It's yours 
....... 
} 
+0

감사를 읽어 보시기 바랍니다 .. – Aldee