2010-06-14 4 views
1

다음 코드는 불필요한 작업입니까?Objective-C iVars/속성에 대한 메모리 관리 기술

1) myArray의 속성 제작 : 수

self.myArray = [NSArray arrayWithArray: newArray]; 

겠습니까 :

@property (nonatomic, retain) NSArray myArray; 

2)에 할당을 변경 나는 다음과 같은 변경을하면 어떻게

@interface MyClass { 
    NSArray *myArray; 
} 

-(void)replaceArray:(NSArray *)newArray; 

@implementation MyClass 

-(void)replaceArray:(NSArray *)newArray { 
    if(myArray) 
    { 
     [myArray release]; 
     myArray = nil; 
    } 

    myArray = [[NSArray alloc] initWithArray: newArray]; 
} 

@end 

조건부를 제거하려면?

답변

0

이미 조건부를 제거 할 수 있습니다. 배열이 nil이면, no-op 인 메시지를 nil에 보냅니다. nil에 대한 지정은 아무런 의미가 없습니다. 그리고 retain 속성으로 만들면 이전 값을 명시 적으로 릴리스하는 것은 잘못된 것입니다.

그러나 코드가 올바르게 작동하지 않는 경우가 하나 있습니다. 인수가 현재 값일 때. 이 경우 현재 값을 해제 한 다음 해제 된 객체 (이미 할당이 취소되었을 수 있음)를 사용하여 새 배열을 만들려고합니다.

3

조건부는 전혀 필요하지 않습니다. 메시지 nil (release 포함)을 보낼 수 있으며 아무런 변화가 없습니다. 또한 새 배열을 할당 할 필요도 없습니다. 당신은 retain 하나를 대신 전달할 수 있습니다. 실제적으로 NSMutableArray을 얻는 것을 당신이 걱정하는 경우에, 당신은 사본을 만들 수있다. 당신이 autorelease을 사용하지 않으려면, 당신이 할 수

- (void)replaceArray:(NSArray *)newArray 
{ 
    [myArray autorelease]; 
    myArray = [newArray copy]; 
} 

을 또는 :

- (void)replaceArray:(NSArray *)newArray 
{ 
    if (myArray != newArray) { 
     [myArray release]; 
     myArray = [newArray copy]; 
    } 
} 
0

을 다음 이미징이 경우

MyClass * myObj; 
// init myObj 
NSArray * array = [myObj myArray]; 
[myObj replaceArray:array]; 

을 나는이 작업을 수행 할 것 , myArraynewArray은 동일합니다. 즉, 출시 후에 사용하는 것을 의미합니다. 이 문제를 해결하려면 replaceArray: 메서드를 제거하고 속성을 @synthesize myArray으로 구현하면됩니다. 따라서 위의 코드는

MyClass * myObj; 
// init myObj 
NSArray * array = [myObj myArray]; 
[myObj setMyArray:array]; 

으로 변경되고 합성 된 구현으로 문제가 해결됩니다. 새 배열을 생성하여 값을 설정하는

참고 :

@property (nonatomic, copy) NSArray myArray; 
0
이 원하는 행동 경우

myArray = [[NSArray alloc] initWithArray: newArray]; 

, 당신은 복사하는 대신 유지하기 위해 속성 정의를 변경해야합니다

나는 물음표의 맥락에서 그의 대답이 옳았 기 때문에 mipadi에 투표했습니다.하지만 재산을 사용하고 replaceArray를 사용하지 않는 이유는 무엇입니까? 전부 :

@interface MyClass { 
    NSArray *myArray; 
} 

@property (copy) NSArray* myArray; 

@end 

@implementation MyClass 

@synthesize myArray; 

-(void) dealloc 
{ 
    [myArray release]; 
    [super dealloc]; 
} 

@end