2011-10-03 2 views
10

iOS 5 SDK를 사용하여 iOS 앱을 개발 중입니다. 자동 참조 횟수 기능이 활성화되어 있습니다. 그러나 나는 많은 수의 객체를 생성하고 있으며, 1 초 후에 배포되어야한다. 그렇지 않으면 디바이스가 매우 느려지 게 될 것이기 때문이다. 기기가 매우 느려서 출시되지 않은 것 같습니다. ARC를 사용할 때 수동으로 개체를 해제 할 수 있습니까?iOS : ARC를 사용하는 상태에서 메모리에서 객체를 제거하는 방법은 무엇입니까?

EDIT : 내 코드.이 코드는 반짝임을 생성하기 위해 초당 200 번 호출됩니다. 그들은 0.8 초 후에 페이드 아웃하기 때문에 그 이후에는 쓸모가 없습니다.

int xanimationdiff = arc4random() % 30; 
    int yanimationdiff = arc4random() % 30; 
    if (arc4random()%2 == 0) { 
     xanimationdiff = xanimationdiff * -1; 
    } 
    if (arc4random()%2 == 0) { 
     yanimationdiff = yanimationdiff * -1; 
    } 

    Sparkle *newSparkle = [[Sparkle alloc] initWithFrame:CGRectMake(20 + arc4random() % 280, 20, 10, 10)]; 
    //[newSparkle setTransform:CGAffineTransformMakeRotation(arc4random() * (M_PI * 360/180))]; //Rotatie instellen (was niet mooi, net sneeuw) 
    [self.view addSubview:newSparkle]; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.8]; 
    [newSparkle setFrame:CGRectMake(newSparkle.frame.origin.x - xanimationdiff, newSparkle.frame.origin.y - yanimationdiff, newSparkle.frame.size.width, newSparkle.frame.size.height)]; 
    newSparkle.alpha = 0; 
    [UIView commitAnimations]; 

스파클 오브젝트 코드 : 당신은 여전히 ​​(NB를 CoreFoundation에서 객체를 유지하고 해제 할 수 있지만

ARC와
#import "Sparkle.h" 

@implementation Sparkle 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"sparkle.png"]]]; 
    } 
    return self; 
} 

@end 

답변

3

당신은 ,dealloc, release, 또는 retain를 호출 할 수 없습니다 : 당신이 dealloc 방법을 구현할 수 있습니다 자신의 사용자 정의 하위 클래스에 대해서는 super dealloc으로 호출 할 수 없습니다. 따라서 간단한 대답은 '아니오'입니다. 아쉽게도 ARC를 사용할 때 수동으로 객체를 릴리즈 할 수 없습니다.

이론적으로 더 이상 객체를 참조하지 않으면 릴리스해야하기 때문에 릴리스되지 않았는지 확인하십시오. 이러한 객체를 생성하면 이러한 객체로 무엇을합니까? 당신은 그 (것)들을 창조하고 그 (것)들을 즉시 파괴 하는가?

아마 당신이 사용하고있는 코드/속성 선언을 게시 할 수 있습니다 -이 weak 또는 strong은 참조 된 개체입니까?

+0

질문에 제 코드를 추가했습니다. – icant

+0

'nil'으로 객체를 설정할 수 없습니까? 루프에서 많은 NSArray 및 Dictionary 객체를 작성하고 전역 배열에 추가하기 때문에 걱정이됩니다. 따라서 나중에 필요하지 않습니다. ARC가 루프에 구축 된 객체를 제거하는 방법은 무엇입니까? – applefreak

+1

그건 어떻게 작동하는지는 잘 모르겠다. for 루프로 객체를 만들고 전역 배열에 추가하면 여전히 유지 될 것이다. 전역 배열에서 * 제거 * 될 때까지는 해제 할 수 없습니다 (즉, 보유 계수가 0 임). – lxt

4

답변을 찾았습니다. 실제로는 정말 바보 같았습니다. 나는 슈퍼 뷰에서 반짝임을 제거하지 않았다. 지금은 타이머 0.8 초 후에 그들을 제거하고 큰 다시 수행 :

+3

멋지다 - 아마 추측 할 수 있듯이, 슈퍼 뷰에 뷰를 추가하면 여전히 유지되므로 문제의 근원 일 가능성이 높습니다. 다행스럽게 고쳐 졌어! – lxt

50
Object* myObject = [[Object alloc] init];  
myObject = nil; // poof... 

편집 : 객체가 해제 될 때 당신은 직접 제어 할 수 없습니다하지만 당신은 간접적 일이 발생할 수 있습니다. 방법? ARC가 정확히 무엇을하는지 기억하십시오. 인간 코딩 규칙과는 달리 ARC는 코드를 파싱하고 릴리스 문을 삽입 할 수 있습니다. 이렇게하면 새로운 할당에 대한 메모리가 즉시 필요 없게됩니다. 의미, 객체를 nil로 설정하거나 단순히 변수가 범위를 벗어나는 것을 허용하는 것 ... A 0 RETAIN COUNT는 ARC가 릴리스 호출을하도록 강제합니다. 그렇지 않으면 누설 될 것이기 때문에 ...해야합니다.

+2

+1 유익하고 이해할 수있는 대답입니다. – piperchester

+0

모든 경우에 해당되는 것은 아닙니다.특정 컴파일러 최적화 기능을 설정하지 않은 경우 (일반적으로 릴리스 모드로 실행하지 않는 경우) ARC는 즉시 객체를 해제하지 않습니다. –

+0

nil로 설정하면 대개 포인터가 매달 리지 않도록 객체가 '탈착'된 후 '완료'됩니다. 어떻게 nil을 설정하면 결국 dealloc이 발생할 것입니까? 원인 및 효과의 역전처럼 보입니다. –

5

@autoreleasepool {...} 문으로 200 번 호출 될 코드 섹션을 둘러싸면됩니다. 이렇게하면 컨트롤이 이벤트 체인을 최상위 수준의 자동 릴리스 풀에 백업 할 때까지 기다리는 것과는 대조적으로 메모리가 즉시 할당 취소됩니다.