2011-09-26 4 views
2

objective-C에서 메모리 관리의 기본 규칙은 alloc을하는 모든 객체에 대해 어딘가에 놓아야한다는 것입니다. 내가이 곳을 해제해야 할 때와 수업 전반에 걸쳐 사용되는 개체를 해제하려면?

@interface NewPollViewController : UIViewController 
{ 
    NSMutableArray * myArray; 
} 

@property (nonatomic, retain) NSMutableArray * myArray; 

@implementation NewPollViewController 
@synthesize myArray = _myArray; 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.myArray = [[NSMutableArray alloc] init]; 
} 

이 self.myArray는 jQuery과의 데이터 소스로 사용되는 것을 말하므로 :

내가 다음 말해봐? dealloc에서? 나는 dealloc의 릴리스가 내 자산에서 설정 한 보유와 일치한다고 생각합니다.

답변

3

예를 들어 기술적으로는 두 번 릴리스해야합니다 (예 : dealloc). 한 번 설정하면 속성은 : 특별히 viewDidLoad 메모리를 할당하고, 속성 설정시 다음도 카운트가 유지되기 때문에 증가

NSMutableArray *a = [[NSMutableArray alloc] init]; 
self.myArray = a; 
[a release]; 

이에 대한 추론이다.

이를 방지하기위한 방법은 정적 NSMutableArray 생성자 중 하나를 사용하거나 또는 autorelease

self.myArray = [[[NSMutableArray alloc] init] autorelease]; 

사용하는 것입니다, 모두 속성을 무시 : 이것은 여분의 생성 유지 피할 것이다

myArray = [[NSMutableArray alloc] init]; 

속성에 의해 (실제로 로컬에서만 사용되는 경우 속성 선언문을 제거 할 수 있습니다).

+0

또한 'dealloc'에서 해제하려고합니다. – Chuck

+1

'self.myArray = [NSMutableArray array]'는 아마도'alloc','init','autorelease' 트리오보다 간결합니다. –

+0

동의 함 - 나는 그 형식도 선호한다. –

0

귀하의 경우 나는 종종 viewDidUnloaddealloc에 공개 할 것입니다.

메모리가 할당 된 위치와 관련하여 미러를 유지하고 싶습니다. viewWillAppear에서 완료되면 viewWillDisappear으로 출시됩니다.

지금부터이 클래스를 사용한다고 말한 이후 init 메서드 또는 awakeFromNib 메서드로 할당 한 다음 dealloc으로 한 번만 출시합니다. 내가있는 NSMutableArray를 노출 할 경우

+0

세 번째 옵션을 위해서, 당신은 여전히 ​​그것을 두 번 풀어 줘야 할 것이다. 왜 당신은 init에있는 Lloc을 한 번 풀어야 만 하는가? – xonegirlz

+0

뷰 또는 뷰어와 관련이 없거나로드되거나 표시되지 않기 때문입니다. 마침내'dealloc '으로 갈 때 당신이 그것을 공개하기를 원할 때입니다. 이것이 'myArrayOfSubviews'라면,로드/언로드 생성 및 릴리스를 수행하여 메모리 경고에 적절하게 응답 할 수 있습니다. – EricLeaf

1

내가 이런 짓을 했을까 : 그 변경 가능한 배열이 다른 클래스가이 배열을 변경하지 않기 때문에

@interface NewPollViewController : UIViewController 
{ 
    NSMutableArray * myArray; 
} 

@property (nonatomic, readonly) NSMutableArray * myArray; 

@implementation NewPollViewController 
@synthesize myArray; 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.myArray = [[NSMutableArray alloc] init]; 
} 

- (void) dealloc 
{ 
    [myArray release],myArray = nil; 
} 

는 읽기 전용으로 속성을 변경하고 제대로 ALLOC 및 해제된다 그것.

+0

NSMutableArray는 하나의 예일 뿐이므로 모든 객체가 될 수 있습니다. – xonegirlz

+0

문자열 리터럴과 iVar가 할당 된 경우이를 할당하고 해제하지 마십시오. 그것의 String 개체라면 copy를 사용할 것이고 viewDidLoad에서 alloc과 init을 할 필요가 없다.보통 당신은 retain을 가진 속성에 alloc을 호출하지 않습니다. – ARC

+1

@ Nikita - 코드가 기술적으로 유출됩니다. 한 줄에 속성을 설정하려면 NSMutableArray 정적 생성자 또는 autorelease 중 하나를 사용해야합니다. 물론 배열을 초기화하는 위치에서 "self"를 제거하지 않는 한. http://stackoverflow.com/questions/156243/object-allocate-and-init-in-objective-c/167783#167783 –

관련 문제