2010-03-10 9 views
0

설정 방법 :object-objective-object에 객체를 보유

OBS : somobject는 클래스의 속성입니다. 에

 
– (void)setSomeObject:(SomeObject *)newSomeobject { 

    [someobject autorelease]; 

    someobject = [newSomeobject retain]; 

    return; 

} 

[somobject 오토 릴리즈] 내가 setSomeObject의 범위에서 객체를 소유하고 더 원하지 않는다고 선언합니다.

다른 개체가 보유한 "someobject"가 해제됩니까? 또는 개체가 setSomeObject 메서드에서만 해제됩니까?

someobject 클래스 atribute가 이미있는 경우?

이 개체의 동작은 어떻게됩니까?

답변

1

같은 이름을 가진 두 개의 변수 (메서드 매개 변수와 인스턴스 변수)가있는 것으로 보아 중대한 문제가 있습니다. 컴파일러 (그리고이 문제에 대한 독자들)는 당신이 언급하고있는 것을 말할 수 없습니다.

– (void)setSomeObject:(SomeObject *)newObject 
{ 
    [someobject autorelease]; 

    someobject = [newObject retain]; 
} 

는 또한 메모리 관리를위한 애플 문서를 읽어야

메모리 관리 문제에 대한

, 그것은 바르에서 다르다 그래서 나는 방법에 매개 변수의 이름을 바꿀 것 Apple's programming guide.

+0

나는 그것을 읽고 이해했습니다. 감사. someobject가 해제되고 atribute가 다른 속성으로 설정되고 retain이 newSomeObject에서 호출되어 객체 소유를 보장합니다. – okami

2

확인 @property@synthesize.

0

당신이 세터에서 달성해야 할 것은 :

  1. 릴리스 이전의 모든 객체
  2. 보관 새 개체
  3. 물론

변수 인스턴스에 새 개체를 할당 문자 그대로 순서대로 수행하면 오래된 객체 인 &이 동일한 경우 객체를 너무 빨리 릴리스 할 위험이 있습니다. 그것이 "autorelease"가 놓일 객체를 스케쥴하기 때문에 당신의 메소드가 반환 된 후에 만 ​​유용합니다.

메쏘드 매개 변수의 이름을 동일하게 (IMHO) 혼동하는 것입니다. 컴파일러에게 경고를 줄 것입니다. 그러나 그렇게하는 것을 절대적으로 주장한다면 "self->"를 사용하여 인스턴스 변수를 참조 다시 ': 당신의 setter 메소드 특별한 뭔가를하지 않는 한

– (void)setSomeObject:(SomeObject *)someobject { 

[self->someobject autorelease]; 

self->someobject = [someobject retain]; 

return; 

}

마지막으로, 당신은 @synthesize 당신의 세터 /가 자동으로 생성 게터 가지고 사용하는 것이 좋습니다.

+0

다윗, 어찌하여 귀환합니까? 나는 또한 많은 예제에서 이것을 보았고 이해하지 못했다. 만약 그 방법이 리턴한다면 왜 당신은 리턴을 호출 할 것인가? – okami

+0

@ 카미 이유가 없습니다. 원본 코드를 복사/붙여 넣기하고 "return;"을 제거하지 않았습니다. 네가 맞다면 아무 목적이 없다. –

+0

하지만 Mac Dev Center의 많은 사례가 있습니다.보세요 : http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB "Acessor Methods"세션으로 이동하십시오. – okami