2013-07-02 5 views
2

Pharo 3.0을 사용하고 있습니다.스몰 토크 - 메모리에있는 모든 것을 제거하는 방법?

메모리에서 모든 개체를 제거 할 수있는 방법이 있습니까? 닫고 이미지를 다시 열어 보려고했지만 모든 것이 여전히 메모리에 남아있는 것처럼 보입니다. General Ledger --> Spending Manager과 싱글로 모두 설정 :

예를 들어, 내가 가진

GeneralLedger>>new 
    instance isNil ifTrue: [instance := super new]. 
    ^instance 

SpendingManager>>new 
    instance isNil ifTrue: [instance := super new]. 
    ^instance 

Spending Manager을 인스턴스화 할 때 길을 따라 어딘가에 엉망 - 즉, 나는 General Ledger의 인스턴스 아닌 인스턴스를 반환 Spending Manager 내 생각 엔?

지금은 내 이미지를로드에 CTRL + P를 수행하려고 할 때 spnder:=SpendingManager new. 내가 얻을 :

spnder = SpendingManager 새. GeneralLedger는

난 지금 Object에서 상속 그래서 SpendingManager에서 상속을 제거했지만, 이것은 여전히 ​​발생합니다.

답변

4

instance을 어떻게 신고하셨습니까?

YourSUperClass classInstanceVariables: 'instance'. 

은 어쩌면 당신은 제대로했지만 그것은 귀하의 게시물에서 불분명하다 (그리고 두 클래스 사이의 계층 구조가 너무 불분명하다) :

는 이러한 경우에 다음과 같이 선언한다.

주요 문제는 super new입니다. 처음 서브 클래스의 인스턴스를 만들 때
, 그것은 super new을 보낼 것이다 것입니다 :

  • 을 중 슈퍼 클래스

  • 의 이미 초기화 된 인스턴스를 반환 또는 서브 클래스 등의 인스턴스를 등록 수퍼 클래스 싱글 톤

대신 instance := self basicNew initialize을 사용해야합니다.

은 또한 당신은 다른 가능성은 단지에 하지 서브 클래스의 새로운 재정, 그냥 작동합니다 슈퍼 클래스의 새로운 모든 일

^instance ifNil: [instance := self basicNew initialize] 

를 작성할 수 있습니다.

마지막으로 초기화를 제거하려면 클래스를 검사하고 편집기에서 직접 인스턴스 (instance) 클래스 인스턴스 변수를 수정하십시오 (이 필드를 선택하고 nil을 입력 한 후 승인).

+2

좋은 답변입니다. 보통 싱글 톤 변수를 없애는 clearInstance라는 메서드를 추가합니다. –

+1

@DavidBuck 좋은 의견입니다. 나는 객체를 수정하는 유일한 방법은 메시지를 보내거나 (#clearInstance에서 생성하는) 메시지를 보내거나 기존 도구로 메시지를 보내도록하는 것입니다 (instVarAt : put : 또는 다른 종류의 경위의 경우 흑 마법). –