2011-03-03 5 views
3

올바른 방법은

- (void) method1 
{ 

list = [[NSMutableArray alloc] init]; 

NSString *f =[[NSString alloc] initWithCString: "f"]; 

[list addObject: f]; 
} 

- (void) method2... 

목록은 클래스의 인스턴스 변수입니다 다음 코드를 고려하는 방법 내부에있는 NSMutableArray 내부에있는 NSString을 넣어, 나는 다른 방법 등 방법 2의 목록 내에서 모든 변수에 액세스 할 필요가, method1에 NSString을 할당 할 때이를 유지해야합니까? 나는 그 보류가 필요 없다는 것을 발견 했습니까? 왜?

+1

결과는 사용자의 기본 문자 인코딩에 따라 다를 수 있으므로'-initWithCString :'은 더 이상 사용되지 않습니다. 그냥 똑바로 리터럴'NSString * f = @ "f"; "또는'-initWithCString : encoding :'을 사용하거나'-initWithUTF8String :'을 사용하십시오 – JeremyP

답변

4

alloc 뭔가가 있다면 이미 소유자이기 때문에 retain은 필요하지 않습니다.

전체 설명은 here입니다.

실제로 메모리 관리와 관련하여 메서드 및 클래스가 잘못 작성되었습니다. 당신은해야한다 :

  1. 릴리스 list 할당 해 새로운 목록을 할당하기 전에

  2. dealloc 방법에 list을 해제

  3. 어레이

    에 추가 한 후 문자열을 해제

그래서 메소드를 다음으로 변경하십시오.

- (void) method1 { 
    [list release]; 
    list = [[NSMutableArray alloc] init]; 
    NSString *f = [[NSString alloc] initWithCString: "f"]; 
    [list addObject: f]; 
    [f release]; 
} 

- (void) dealloc { 
    [list release]; 
    // release other instance variables... 
    [super dealloc]; 
} 
+0

왜 method1 끝에 f를 놓아야합니까? – Howard

+0

당신은 alloc에 ​​의해 함축 된 유지의 균형을 유지해야하기 때문에 ... – bbum

+0

정확히, 당신이 그것을 allocate했기 때문에 그것을 풀어주는 것이 당신의 책임입니다. –

0

당신은 "F"

@ 해당 문자열에 대한 @ 필요하고이 메모리 관리 문제를 다루고 NSMutableArray memory management

+0

NSString이 아닌 C 문자열로 초기화하기 때문에'@'는 필요 없습니다. – yan

+0

그는'initWithCString :'을 사용하고 있기 때문에 @는 부적절합니다. 명심하십시오, 이것은 * deprecated method *이므로 @Howard, 사용하지 마십시오! – Richard

+0

죄송합니다. 너희들 말이 맞아. 아니 @ 필요합니다. – madmik3

0

당신이 소유자로 당신은 그것을 유지 할 필요가 없습니다 때 alloc 클래스 및 인스턴스를받습니다. 실제로 NSMutableArray에 추가 한 후에이를 릴리스해야합니다. NSMutableArray에 개체를 추가 할 때 메시지에 retain 메시지를 보내고 소유권을 가져옵니다.

또한 initWithCString은 더 이상 사용되지 않습니다.

[NSString stringWithCString:"f" encoding:NSUTF8StringEncoding]; 

을하지만 그냥 상수는 NSString을 만드는 경우, 바로 문자를 사용하면 C 문자열에서 초기화하기 위해서해야하는 경우 대신 다음과 같은 패턴을 사용합니다. 자동으로 자동 출시되며 사용자의 의도가 더 명확 해집니다. ie :

list = [[NSMutableArray alloc] init] 
[list addObject:@"f"]; 
+0

>> NSMutableArray에 객체를 추가 할 때 객체를 보유 메시지를 보내고 소유권을 가져옵니다. - 이것에 관한 어떤 서류? – Howard

+0

@Howard : 실제로이 정보가 필요하지 않습니다. 알아야 할 중요한 점은, 당신이 그걸 풀어 주어야한다는 것입니다. _other_ 코드가 _your_ 코드를 올바르게 작성하는 방법을 알 필요가 없습니다. –

관련 문제