2011-12-13 1 views
2

나는ARC에서 myiVar = nil이 지원됩니까?

if ([Array count] != 0) { 
    Array = nil; 
} 
Array = [[NSMutableArray alloc]init]; 

ARC를 사용하는 경우이 허용되어 같은 코드를 사용하고 있습니다? 이것은 어떤 종류의 충돌을 유발합니까? 내가이 일을하는 이유는 내 메소드가 호출 될 때마다이다. Array은 새로운 데이터 세트를 얻는다. 내 수업의 여러 곳에서 이런 종류의 스 니펫을 사용하고 있습니다.

+3

귀하의 코딩 스타일에 대한 간단한 제안 (그리고 단정 짓기에 대한 미안함). 변수 이름은 소문자로 시작하고 클래스 이름은 대문자로 시작한다는 ObjC 개발자 커뮤니티의 동의가있는 것 같습니다. 변수 이름에 대문자의 첫번째 문자를 사용하면 다른 개발자가 코드를 읽는 것이 더 어려워집니다. –

+1

배열을 새 NSMutableArray에 할당하기 전에 배열을 nil로 설정할 필요조차 없습니다. 변수가 지정되면 이전 값은 새 값을 얻기 전에 해제됩니다. –

답변

10

ARC를 제외하고, 작동은 무의미합니다. 당신은 nil에 ivar를 지정하고 즉시 다른 것에 할당합니다. 이것은 다른 것을 할당하는 것과 다르지 않습니다.

ARC 이전에는 변수에 이전 값이있는 경우 메모리 누출이있었습니다 (nil에 대한 지정 또는 지정이 없음). ARC에는 누수가 없습니다.

+0

누출에 대해 확실하지 않습니다. 배열이 유지되지 않은 경우 왜 누출되어야합니까? – Alin

+0

위의 코드 섹션이 여러 번 호출 될 것이라고 가정합니다. 따라서'Array'에 값이 있으면 alloc/init을 통해 만들어졌습니다 – jrturton

+0

@Alin :'-init :'호출은 +1을줍니다 보유 수에 – Dov

3

최상의 해결책 : 직접 테스트하고 직접 확인하십시오! 이것은 아주 간단한 예입니다!

네, 물론 작동합니다! ARC는 자동 참조 횟수를 의미합니다. 단지 release, retain 등등에 신경 쓸 필요가 없다고 말합니다.

개체를 없애려면 간단한 포인터 할당을 사용하면됩니다.

그리고 코드에 대해서는 다시 할당하기 전에 Array를 nil로 설정하십시오! 내 배열 객체

Then Array point to a new nil object 

이있는 경우

그러나 모든 경우에 당신이 할 :

봅니다 코드의 논리를 얻을 수

내 배열 점에 새로운 NSMutableArray 객체

조건이 true로 평가 되든 그렇지 않든간에 변수는 바로 다음에 다른 값을 취하므로 쓸모가 없습니다!

+0

이것은 내 대답보다 훨씬 더 밝은 :) – jrturton

0

귀하가 보여 주신 샘플 코드가 유효합니다. 다음은 몇 가지 변형은 :

if ([Array count] != 0) { 
    Array = [[NSMutableArray alloc] init]; 
} 

예 2

if ([Array count] != 0) { 
    Array = [NSMutableArray array]; //value will be retained 
} 

예 3

if ([Array count] != 0) { 
    self.Array = [[NSMutableArray alloc] init]; //Will NOT leak under ARC. 
} 

예 4

//if ([Array count] != 0) { 
[Array removeAllObjects]; 
//} 

네 예 ARC하에 유효 .

또 다른 사실 : 인스턴스 변수는 일반적으로 첫 번째 문자가 소문자이지만 CamelCase 메서드는 계속됩니다. 이를 수행하는 또 다른 방법은 변수 이름 앞에 밑줄을 붙이는 것입니다. @property 값과 일치하는 @synthesize 메서드가없는 경우이 작업이 수행됩니다.