2010-02-18 2 views
0

당신은 인스턴스 변수 (예)@synthesize의 메서드는 무엇입니까? 당신이 재산을 합성 할 때

[newPlanet setName:@"Jupiter"]; 
[newPlanet setMass:57]; 
NSString *closestName = [newPlanet name]; 
int largestMass = [newPlanet mass]; 

CelestialBody *newMoon = [[CelestialBody alloc] initWithName:@"Callisto"]; 
[self setMoon:newMoon]; 
[newMoon release]; 

각각 세터와 게터를 얻을 수 있지만, 당신은 또한 사용하여 객체를 해제 할 수있는 능력을 얻을

@interface CelestialBody : NSObject { 
    NSString *name; 
} 
... 

@interface Planet : NSObject { 
    NSString *name; 
    int mass; 
    CelestialBody *moon; 
} 
@property(nonatomic, retain) NSString *name; 
@property(assign) int *mass; 
@property(nonatomic, retain) CelestialBody *moon; 
... 

@implementation Planet 
@synthesize name; 
@synthesize mass; 
@synthesize moon; 
... 

(아래 참조). ..

// Releases the object (frees memory) and sets the object pointer to nil. 
[self setMoon: nil]; 

물론 각 클래스에 대한 dealloc이 있습니다.

// Moon 
-(void)dealloc { 
    [name release]; 
    [super dealloc]; 
} 

// Planet 
-(void)dealloc { 
    [name release]; 
    [moon release]; 
    [super dealloc]; 
} 

나는이 권리를 얻고 있습니까?

게리

+0

천체에 달이 하나 이상 있으면 어떻게됩니까? –

+0

더 많은 공식적이거나 유용한 것을 디자인하지 않은 점을 강조하는 예로 한 달만 있습니다. – fuzzygoat

답변

2

행성 객체를 사용하여, 다른 클래스 내에서 속성으로 선언하지 않는 한/속성을 복사, 당신이 그것을 해제 할 수있는이 방법을 유지합니다.

retain/copy를 사용하여 속성을 선언하면 결과 setter는 이전 값을 해제하고 새 값을 할당하여 프로세스에서 유지 또는 복사합니다. nil을 전달하면 이전 값을 해제하고 nil을 지정하고 유지 또는 복사하며 nil을 유지/복사하면 nil이므로 효과적으로 이전 값을 해제하고 ivar에 nil을 할당합니다.

이것은 인스턴스 변수를 해제하는 데 사용할 수있는 방법입니다.

이 방법으로 newPlanet 인스턴스를 릴리스하려면 클래스에서 retain 또는 copy 속성으로 선언해야합니다.

추가 예제로, 행성 객체가이 방법으로 속성을 선언 했으므로이 메소드를 사용하여 행성 객체를 릴리스 할 수 있습니다.

또는 행성 클래스의 할당 해제의 방법에

, 당신은 할 수 :

self.name = nil; 

이 이름을 해제하고 거기에 무기 호를 할당합니다.

+0

그게 내가 무엇을 얻었는지, 내가 처음에 썼어야했던 것에 더 잘 맞게 질문을 리펙토링 할 것이다. – fuzzygoat

0

이 예제는 하나의 클래스의 ivars (Planet의 ivars)의 합성을 보여 주지만 다른 (self가 무엇이든)의 합성을 보여줍니다. 마지막 예제에서 "self"의 "newPlanet"속성도 (retain)으로 합성 되었습니까? 그렇다면 : 예, newPlanet을 nil로 설정하면 이전의 "newPlanet"이 무엇이든지 해제됩니다.

0

나는 당신이 올바르게하고 있다고 생각합니다. 아마 당신의 dealloc 방법으로,

self.moon = [[CelestialBody alloc] initWithName:@"Callisto"]; 

을하고 나중에 출시 : 귀하의 질문에 업데이트 한 후 , 그래, 당신은 그렇게 할, 또한 수

self.moon = nil; 

애플의 오브젝티브 C 2.0 속성 및 메모리 관리 문서는 꽤 좋다. Mac Dev Center 라이브러리를 확인하십시오.

+1

정말입니까? 내 @property 달도 보유, 그래서 내가 alloc을 공개해야하고, 마지막으로 보유를 해제합니까? – fuzzygoat

+0

확실합니다. @property를 선언 할 때 'retain'키워드의 목적은 자동 생성 된 접근자가 당신을 위해 유지/해제주기를 관리한다는 것입니다. 접근 자없이 ivar을 직접 릴리즈 할 수도 있습니다. 많은 가능성이 있습니다. – djromero

1

만큼 당신이 assign 속성을 선언하지 않았다으로,

예 "당신은 또한 객체를 해제 할 수있는 능력을 얻을".당신은 아마 알다시피

, (아마도되지는 기본 하나 있지만) 선언 된 속성을 사용하는 이유 중 하나는 당신이 할 수 있다는 것입니다 :

self.moon = aMoon; 

보다는를;

[self setMoon:aMoon]; 

등가입니다. 즉, 귀하의 해제는 다음과 같이 할 수 있다는 것을 의미 :

self.moon = nil; // Releases and sets to nil 

하지만 기억 만하지 않을하기 :

moon = nil; // Sets to nil, doesn't release 

그것은 단지 객체를 해제하지 아주 좋은 연습하지만 전무로 변수를 설정, 그렇지 않으면 다른 코드가 실수로 변수에 남아있는 포인터를 사용하려고 할 수 있기 때문입니다.

+0

감사합니다. 많이 감사합니다. – fuzzygoat

관련 문제