2014-01-28 10 views
1

다음 두 예제는 각각 잘 작동하는 것 같습니다. 실시 예 1, 위젯은 while 루프 전에 생성된다alloc init을 사용하는 경우

-(int)compareWidgets { // Example 1 

    int count = 0; 
    NSMutableArray *widgetsCopy = [self.widgets mutableCopy]; 

    Widgets *widget = [[Widgets alloc]init]; // HERE ? or... 

    while (widgetsCopy.count) { 
     widget = [widgetsCopy lastObject]; 
     [widgetsCopy removeLastObject]; 
     for (Widgets *compareWidget in widgetsCopy) 
      if (compareWidget.value == widget.value) 
       count += 1; 
    } 
    return count; 

} 실시 예 2

,은 while 루프 내부에서 생성 위젯 ...

-(int)compareWidgets { // Example 2 

    int count = 0; 
    NSMutableArray *widgetsCopy = [self.widgets mutableCopy]; 

    while (widgetsCopy.count) { 
     Widgets *widget = [widgetsCopy lastObject]; // HERE ? 
     [widgetsCopy removeLastObject]; 
     for (Widgets *compareWidget in widgetsCopy) 
      if (compareWidget.value == widget.value) 
       count += 1; 
    } 
    return count; 

}

1 : 예 1에서, 위젯은 한 번만 초기화되고 배열을 통해 반복 될 때마다 재 할당됩니다. 예제 2에서 alloc/init은 결코 사용되지 않지만 각 반복을 통해 위젯이 다시 할당됩니다. 이것이 가능한 이유는 무엇이며 어떤 예가 정확하거나 바람직합니까?

Q2 : [widgetsCopy removeLastObject] : 또한, 어느 경우 위젯 바로 그 배열로부터 제거 어레이 오브젝트에 할당된다. 객체 위젯이 배열에서 제거되었으므로 위젯은 현재 올바른 값을 유지하지 못하는 이유는 무엇입니까?

감사합니다.

+0

[iOS 메모리 관리 기본 사항] (http://blog.teamtreehouse.com/ios-memory-management-part-1)을 읽어야합니다. 현대 iOS는 많은 상용구를 제거하는 ARC라는 시스템을 사용하지만 여전히 기본에 익숙해야하며 질문에서 판단하지 못합니다. – bdesham

답변

1

첫 번째 코드 조각은 alloc/init의 개체를 만들고 while의 본문은 즉시 해제합니다.

개체를 만들어 변수에 할당하여 해당 변수를 "유효"하게 만들 필요가 없습니다. 할당 당시 범위에있는 한 변수를 할당 할 수 있습니다.

Widget

때문에 ARC 변수에 따라, 당장 nil가되지 않습니다 그래서 widget에 대한 할당은 해당 개체가 유지되고 리드, 기본적으로 __strong 있습니다. Widget *widget__weak Widget *widget으로 변경하면 nil이 표시되지만 처음에는 그 변수를 선언 할 필요가 없습니다.

0

포인터를 빈 상자로 간주하십시오. 첫 번째 예에서는 상자에 새 위젯을 넣습니다. 그런 다음 바로 그 상자를 비우고 그 상자에 lastObject를 넣습니다. 위의 예제는 마지막 객체를 제거 할 때까지 위젯이 배열에 남아 있기 때문에 약간 분해됩니다. ARC를 사용하면 상자가 몇 개나 있는지 걱정할 필요가 없습니다. 마지막 상자에서 꺼내어 놓으면 상자가 열립니다.

관련 문제