문제

Objective-C,는 경우 array1 이에 복사 배열 2 를 사용하여 mutableCopy,그리고 코드에서 수행되는 main(),에 대한 책임이 누구를 방출에 포함된 개체 배열?그것은 주요()또는 배열 2?

도움이 되었습니까?

해결책

내 생각에 이전 답변을 놓쳤다는 점,또는 다른 asker 매우 불분명합니다.실제 문제는지에 대해 얘기하거나 배열이지만,오히려 배열 내용:

에 대한 책임이 누구를 방출 객체에 포함된 배열?그것은 주요()또는 배열 2?

모두 array1array2 에 대한 책임은 해체입니다.

있기 때문입 문서:

"배열을 유지에 대한 강력한 참조 자신의 내용에서 관리되는 메모리 환경을,각각의 개체를받을 유지하는 메시지기 전에는 해당 id 를 추가하면 배열 및 출시할 때 제거에서 배열할 때 또는 배열에 할당 해제됩니다."

을 시작으로,각각의 개체를 유지해 있기 때문입 array1.을 만들 때 array2 via -mutableCopy, 당신 NSMutableArray 는 점을 동일한 개체를 유지하고 그들 각각은 다시합니다.당신이 하 릴리스 array1 이 시점에서,때 그 dealloc 방법 이라고 했다는 것 릴리스의 각각의 개체 포함되어 있습니다.그러나, array2 유지하고있다,그래서 객체지 않을 것이 파괴될 때에만 자신의 유지할 수가 0 에 도달하는 경우에 일어날 것 array2 파괴되었고 다른 누구도 유지하고있다 어떤 물체의(또는 그들은 때 제거에서 array2).

이 컬렉션 클래스(배,세트,사전,etc.) 핸들 유지 및 발표 자신의 내용,모든 당신에 대해 걱정이 유지하거나 해제합 컬렉션을 자체입니다.이후 당 사용 -mutableCopy, 기억이 있는 암시적으로 보관 array2, 다,그래서 당신은 그것을 해제할 때에는 더욱 그렇습니다.

다른 팁

나는 참조한다 이 안내서 OBJ-C의 메모리 관리 용. 그는 배열 및 사전에 관한 섹션이 있습니다. 여기에 발췌가 있습니다.

배열, 사전 등. 일반적으로 추가 된 객체를 유지합니다. (제 3 자 컬렉션 유형 객체를 다룰 때는 문서를 항상 확인하여 유지 여부를 확인하십시오). 이는이 컬렉션이 객체의 소유권을 갖고 추가하기 전에 유지할 필요가 없음을 의미합니다.

게시에 대한 의견도 유용합니다

배열에 개체를 저장하여 소유권 책임은 변경되지 않습니다. 예는 다음과 같습니다.

int main(int argc, char *argv[])
{
    // ...

    NSObject *obj1 = [[NSObject alloc] init]; // owned
    NSObject *obj2 = [[NSObject alloc] init]; // owned
    NSObject *obj3 = [[[NSObject alloc] init] autorelease]; // not owned

    NSMutableArray *array1 = [NSMutableArray arrayWithObjects: obj1, obj2, obj3, nil]; // not owned
    NSMutableArray *array2 = [array1 mutableCopy]; // owned

    // ...

    [array2 release];
    [obj2 release];
    [obj1 release];

    // ...
}

이 코드는 직접 할당됩니다 obj1 그리고 obj2, 그래서 그것은 그것들을 소유하고 해제해야하지만, 그것은 자동 장착입니다. obj3, 그것을 공개 할 필요는 없습니다. 같은 방식으로, 그것은 결과를 소유하지 않습니다. arrayWithObjects:, 그것은 그것을 공개하지 않지만 결과를 소유하고 있습니다. mutableCopy, 그래서 그것은 그것을 공개해야합니다. 배열에 저장되는 객체는 관련이 없습니다.

두 배열 모두 컨텐츠에 대한 강력한 참조를 유지하므로 obj1, obj2, 그리고 obj3 배열이 존재하는 한 거래되지는 않지만 이는 세부 사항입니다. NSArray 계약은 객체 또는 배열의 소유권을 관리하는 방법에 영향을 미치지 않습니다.

이것들은 모두 세부 사항입니다 코코아의 메모리 관리 규칙, 배열이 아닙니다.

돌연변이가있는 배열이 불변의 배열에 묶여있는 것은 의미가 없습니다. Main ()은 배열을 방출 할 책임이 있습니다 1.

그러나 내 경험상, 객체를 공개하면 응용 프로그램이 충돌합니다. OBJC는 메모리를 자동으로 관리하는 데 능숙합니다. 내 코코아 앱은 몇 시간을 실행 한 후에도 시작보다 더 많은 메모리가 필요하지 않은 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top