2009-08-17 8 views
1

원인 TRUE로 설정 됨배열 누출

그러나 SearchCriteria * tmpSc = [[SearchCriteria alloc] init]; 누수가 발생하고 해결 방법을 모르겠다. 함수의 끝에서 놓으면 포인터가 풀려서 충돌한다.

아이디어가 있으십니까?

답변

5

검색 필터가 큰 경우 twolfe18에서 코드를 훨씬 느리게 만듭니다. -objectAtIndex:은 대용량 어레이에서 빠른 작업이 아니므로 사용자가해야하는 것보다 더 많이 수행하면 안됩니다. (사실 FE가 objectAtIndex :보다 빠르다는 사실은 문제를 과장하여 파탄 열심히하기의 장점에 대한 저의 다른 의견을 참조하십시오.)

코드에 여러 가지 문제가 있습니다.

  • "설정"을 시작하지만 접근자가 아닌 메서드는 생성하지 마십시오. Objective-C가 Key-Value Compliance를 제공하는 방법 때문에 매우 놀라운 버그가 발생할 수 있습니다. 이름이 중요합니다. userFilters이라는 속성에는 -userFilters이라는 게터와 -setUserFilters:이라는 세터가 있어야합니다. setter는 getter가 반환하는 것과 동일한 유형을 사용해야합니다. 따라서이 방법을 사용하면 더 이상 -updateUserFilters이라고 불리는 것이 좋으며 무엇을하는지 더 정확하게 나타낼 수 있습니다.

  • 항상 접근자를 사용하십시오. 그들은 모든 종류의 메모리 관리 문제를 저장합니다. -setUserFilters을 두 번 호출하면 현재 코드가 전체 배열을 누설합니다.

  • 여기에 임시로 할당 할 필요가없는 두 가지 의견이 모두 맞습니다. 실제로 가장 좋은 해결책은 Fast Enumeration을 사용하는 것입니다. Fast Enumeration은 매우 빠르고 메모리 효율이 뛰어납니다 (코드 작성이 가장 쉽습니다).

    @interface MyObject() 
    @property (nonatomic, readwrite, retain) NSMutableArray *userFilters; 
    @property (nonatomic, readwrite, retain) NSMutableArray *searchFilters; 
    @end 
    
    @implementation MyObject 
    @synthesize userFilters; 
    @synthesize searchFilters; 
    
    - (void)dealloc 
    { 
        [searchFilters release]; 
        serachFilters = nil; 
        [userFilters release]; 
        userFilters = nil; 
        [super dealloc]; 
    } 
    
    
    - (void)updateUserFilters 
    { 
        //init the user filters array 
        // The accessor will retain for us and will release the old value if 
        // we're called a second time 
        self.userFilters = [NSMutableArray array]; 
    
        // This is Fast Enumeration 
        for (SearchCriteria *sc in self.searchFilters) 
        { 
         if(sc.enabled) 
         { 
          [self.userFilters addObject:sc]; 
         } 
        } 
    } 
    
    : 모두 함께 이겠지

, 여기 당신이 (다른 많은 좋은 솔루션이있다, 그것을 할 방법을 하나 이상하지만,이 일을 이해하는 것은 매우 간단하다)하고 싶은거야

+0

'objectAtIndex'는 일정 시간 (배열입니다!)에서 작동하지만, 큰 배열에서 상당히 느려지지 않습니다. 바보입니다. 만약 당신이 그것을 테스트했고'objectAtIndex'가 당신이 추천하는 것보다 2 % 이상 더 느리다는 것을 솔직하게 말하고 싶다면, 당신은 다른 것에 시간을 보내는 것이 나을 것입니다. – twolfe18

+1

루프에서 수행되는 작업의 복잡성에 따라 루프에서 2 %에서 35 % 사이의 향상을 측정했습니다 (루프에서 작업이 줄어들수록 분명히 개선됨). 적은 타이핑이 필요하다는 사실은 대개 판매 시점을 매기는 것입니다. mutate가 다른 스레드에서 돌연변이가 발생하더라도 잘못된 동작이 아닌 루프 중에 실수로 배열을 변경하면 예외가 발생합니다. 나는 당신이 인식 된 성과에서 드라마틱 한 개선을 자주 보지 않을 것이라고 인정합니다. –

+2

NSArray는 배열과 같은 작업을 지원하는 객체에 대한 인터페이스를 제공한다는 의미에서 "배열"입니다. 커버 안의 C 배열과 같이 구현되는 것이 보장되지는 않으며 객체 접근 속도에 대한 성능 보장도 없다. – peterb

0

우선, 쓰기가 가능한 최악의 n00b 코드는 if(condition==true) do_something()이며, 단지 if(condition) do_something()으로 작성하십시오.

-(void)setUserFilters{ 

//init the user filters array 
userFilters = [[NSMutableArray alloc] init]; 
for(int i=0;i<[searchFilters count];i++) 
{ 
    if([self.searchFilters objectAtIndex:i].enabled) 
      [userFilters addObject:[self.searchFilters objectAtIndex:i]]; 
} 
} 
+0

또한 Objective-C에서 키워드는'true & false' 대신'YES & NO'입니다. 때때로 진실은 효과가 있지만 그것에 의지하지 마십시오. – jbrennan

+0

올바른, 목표 -C는 YES와 NO를 사용합니다. 그러나 TRUE, FALSE, TRUE, FALSE는 모두 #와 YES로 해석되도록 정의되어 있습니다. 나는 진실 또는 거짓이 작동하지 않는 경우를 보지 못했습니다. 좋은 스타일은 YES와 NO를 사용해야한다고 말합니다. – twolfe18

+2

YES는 서명 된 char에 대한 1 캐스트로 정의됩니다. true는 C에서 기호 "1"로 바뀝니다 (따라서 형식과 크기는 정의되지 않습니다). C++에서 true는 bool 유형입니다. 예, 일반적으로 조건부에서 유사하게 해결됩니다. 그들은 같은 크기가 아니며 같은 것을 인코딩하지 않을 수도 있습니다. 그들을 섞지 마십시오. Objective-C 진리 값은 YES이고 유형은 BOOL입니다. –

2

당신이 처음에는 전에 SearchCriteria 개체를 만드는 것을 보인다

초, 당신은 다음과 같이 단지 수, (그것을 위해 ALLOC 메모리를 신경 쓰지 않음) 전혀 tempSc을 할 이유가 없다 변수를 사용하거나 self.searchFilters의 다른 객체에 변수를 재 할당합니다. 따라서 초기 객체를 생성 할 필요가없고 누출 및 릴리스되지 않는 이유는 없습니다.

보십시오 : 도움이

SearchCriteria *tmpSc = nil; 

희망.

+0

= nil, 당신이 용의치가 있다고 생각합니다. null은 Java ism이고 NULL은 다른 포인터 유형 (일반적으로 nil은 id *입니다)에 대한 void *입니다. 비록 그들이 같은 유형으로 컴파일했기 때문에, 당신은 어느 쪽이든을 사용하여 끝날 수 있습니다 ... – AlBlue

+0

네, 당신 말이 맞아요. 고맙습니다. –