2

내 아이폰 앱에서 패킷 수가 많을 때 충돌이 발생합니다. xcode에서 메모리 압박으로 인해 앱 종료를 경고합니다. 몇 가지 장소에서 내 코드에서 루프에 대한 몇 가지 객체를 할당하고 할당 된 객체를 대기열에 추가하면 for 루프 내에서 해당 객체를 해제하고자하는 것을 추가 한 후 ARC가 활성화 된 프로젝트이므로 릴리스 할 수 없습니다. , 내 질문은이 경우 도움이 될 것입니다? 그것을 풀어 놓지 않고, 만약 우리가 그 객체들을 nil로 설정한다면, 메모리를 해제 할 것인가? (나는 을 안다.은 retain 수를 줄이지 않을 것이다) nil을 설정하면 메모리 사용을 줄이는 데 도움이 될 것인가?iphone 응용 프로그램이 메모리 부족으로 인해 충돌합니다.

내 코드는 당신이 더 이상 필요하지 않을 때

NSMutableArray* arrObj = [[NSMutableArray alloc]init]; 
for(i=0; i<=count;i++) 
{ 
    ClassA * Obja = [[classA alloc]initwithdata:xx]; 
    ClassB * Objb = [[classB alloc]initwithdata:xx]; 
    ClassC * Objc = [[classC alloc]initwithdata:xx]; 

    [arrObj addObject:obja]; // Since its ARC we cant release obja will obja=nil this help? 
    [arrObj addObject:objb]; // Since its ARC we cant release objb will objb=nil this help? 
    [arrObj addObject:objc]; // Since its ARC we cant release objc will objc=nil this help? 

} 
+0

를 시도? 이미지 데이터입니까? – Gaurav

+0

왜 ClassA를 할당합니까 * Obja = [[classA alloc] initwithdata : xx]; 루프에 ? –

+1

악기 사용 : 어떤 개체가 메모리 사용 공간을 늘리는 지 확인하기위한 할당. – Andrei

답변

1

는 ARC가 자동으로 해제됩니다 다음 예와 같이 일부는, 당신이 그 전무 필요 없어 말한다.

하지만 임시 데이터가 많은 경우 Autorelease Pool Block을 사용할 수 있습니다.

while (x < y){ 
    @autoreleasepool { 
     // lot of temporary stuff 
    } 
} 

당신은 메모리 관리 문제를 해결하기 위해 정말 좋은 쉬운 튜토리얼을 엑스 코드 악기에 대한 here을 찾을 수 있습니다.

+0

고맙습니다. 답장을 보내 주신다면, 객체에 아무 것도 설정하지 않으면 컴파일러가 해제 할 수 없습니까?(나는 컴파일러가 즉시 nil로 설정된 메모리에서 객체를 제거 할 것이라고 생각하고 있었다.) –

+0

더 이상 참조가 없을 때 릴리즈 할 것이다. 따라서 위임자에게 약한 연결이 필요하거나 두 요소가 서로 유지되는주기를 유지해야합니다. http://stackoverflow.com/questions/8449040/why-use-weak-pointer-for-delegation – Laszlo

0

ARCretains, releasesautoreleases을 없애지 않으며 필요한 항목 만 추가하면됩니다. 그래서 여전히 retain에 대한 호출이 있고, 에 대한 호출이 여전히 있습니다. release에 대한 호출이 있습니다.

이 문제를 줄이려면 도구를 사용해야합니다. 메모리 문제에 관한 기사 : Locating Memory Issues in Your App

@autoreleasepool 블록을 사용하십시오. 이것들은 객체의 소유권을 포기할 수 있지만 즉시 할당 해제 될 가능성을 피할 수있는 메커니즘을 제공합니다. 블록 내에서 오토 릴리즈 메시지를 수신 객체는 오토 릴리즈 메시지가 전송 된 릴리스 메시지 객체가 때마다 릴리스 메시지를 수신 전송, 오토 릴리즈 풀 블록의 끝에서

: 애플의 Advanced Memory Management Programming Guide는 설명 블록 내에서.

0

왜 이러한 classA, classB 및 ClassC를 루프에 할당합니까? 외부에 배정되고 매번 데이터가 변경되도록하십시오. 그것이 더 나은 방법입니다.

사이에서만 데이터를 정리할 수 있습니다.

0

는 xx는 무엇의 약자인지이

NSMutableArray* arrObj = [[NSMutableArray alloc]init]; 
ClassA * Obja = [[classA alloc]initwithdata:xx]; 
ClassB * Objb = [[classB alloc]initwithdata:xx]; 
ClassC * Objc = [[classC alloc]initwithdata:xx]; 
for(i=0; i<=count;i++) 
{ 
[arrObj addObject:obja]; 
[arrObj addObject:objb]; 
[arrObj addObject:objc]; 
} 
관련 문제