2012-12-14 2 views
0

개체는 여전히 값을 제공합니다. ARC는 (오프 수단)오브젝트는 여전히 값을 제공합니다. ARC는 표시가 아니 었습니다 (꺼짐을 의미)

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view, typically from a nib. 
    //test of retain and copy 

     NSString *s1 = [[NSString alloc] initWithString:@"String1"]; 
     NSString *s2 = [s1 copy]; 

     [s1 release]; 
     [s1 release]; 
     [s2 release]; 

     if(s1!=nil) 
     { 
      NSLog(@"11111"); 
      NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil]; 
      [array release]; 

      NSLog(@"S1 - %@ \n S2 - %@ \n Array - %@",s1,s2,array); 
     } 
    } 

=== 출력 === 표시되지 않은

2012년 12월 14일 15

: 04 : 207 940] 11111 2012년 12월 14일 01.165 testMM 04 : 15 01.168 testMM [940 : 207] S1 - 문자열 1 S2 - 문자열 1 어레이 - S1 - 문자열 1 S2 - 문자열 1 어레이 -

답변

0

먼저, 해제 된 객체에 액세스하기 정의되지 않은 동작이다. 그것은 원래의 객체 (사용 된 메모리가 덮어 쓰여지지 않은 경우)처럼 보이거나 다른 객체 (나중에 그 객체에 할당 됨)에 액세스하거나 임의의 가비지 (객체가 아닌)에 액세스 할 수 있습니다), 충돌하거나 다른 이상한 일을 할 수 있습니다. 해제 된 객체에 대한 호출을 잡기 위해 좀비가 켜져 있지 않은 한 객체가 할당 해제되었는지 여부를 알 수있는 방법이 없습니다.

뿐만 아니라 모든 보유 기간을 해제 한 후에도 개체가 언제 할당 해제되는지 보장 할 수 없습니다. 객체는 보유 개수가 0 일 때 할당이 해제됩니다. 그러나 객체를 할당하고 해제하더라도 일부 API가 유지 한 다음 자동 등록 할 수 있습니다. 예 : 배열을 할당 한 다음 즉시 해제 할 수 있지만 initWithObjects:에서는 자체를 보유하고 자동으로 리디렉션 할 수 있습니다 (객체를 유지하고 자동 해제하는 것이 결코 바람직하지 않음). init에서는 발생하지 않을 수 있습니다.

특히이 경우 문자열의 경우 @"String1"은 정적 메모리에있는 리터럴 문자열이며 retainrelease과 같은 메모리 관리 작업은 아무 것도하지 않습니다. NSString, 상수 문자열을 기반으로 새 문자열을 만들면 상수 문자열 만 반환됩니다. 상수 문자열의 copy도 상수 문자열을 반환합니다. 따라서 기본적으로 s1s2은 영원히 존재하는 정적 메모리의 문자열 리터럴을 가리 킵니다. release은 효과가 없습니다. (그러나 여전히 메모리 관리 규칙의 관점에서 올바르지 않습니다.)

array이 할당되고 해제되었습니다. 여기서 일어난 일은 (위의 이유들로 인해 여기에 추측됩니다) 그 배열은 실제로 할당이 해제되었지만 메모리의 일부는 짧은 시간 이었기 때문에 인쇄 할 때 겹쳐 쓰지 않았습니다. 다시 말하지만 이것은 정의되지 않은 동작입니다.

관련 문제