2010-07-08 2 views
3

을 유지 나는 내 AppDelegate에있는 "myDBManager"라는 변수 만든 : 나는 글로벌 변수가 모두 유지 대부분의 다른 클래스에서 사용전역 변수로 AppDelegate에의 변수를 사용하여 - 질문을 릴리스에 대한/

@interface myAppDelegate : NSObject <UIApplicationDelegate> { 
    MyDBManager *myDBManager; 
} 
@property (nonatomic, retain) MyDBManager *myDBManager; 

@end 

을 내 중요한 응용 프로그램 데이터 그것은 한 번만 생성되고 끝에서만 죽습니다. 예를 여기

@interface AnyOtherClass : UITableViewController { 
    MyDBManager *myDBManager; 
    NSObject *otherVar; 
} 
@property (nonatomic,retain) MyDBManager *myDBManager; 
@property (nonatomic,retain) NSObject *otherVar; 
@end 

//getting the data from "global" myDBManager and putting it into local var of AnyOtherClass 
- (void)viewWillAppear:(BOOL)animated { 
    //get the myDBManager global Object 
    MyAppDelegate *mainDelegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate]; 
    myDBManager = mainDelegate.myDBManager; 
    } 


- (void)dealloc { 
     [otherVar release]; 
     //[dancesDBManager release]; DO NOT RELEASE THIS SINCE ITS USED AS A GLOBAL VARIABLE! 
     [super dealloc]; 
     } 

AnyOtherClass

에 myDBManager에 도착하는 그래서 제 질문은 다음과 같은 "otherVar"로 AnyOtherClass의 다른 모든 지역 변수가 AnyOtherClass의 할당 해제의 방법에 출시되는 반면 (항시는 점이다 AnyOtherClass 내에서 myDBManager를 해제하면 앱에서 오류가 발생합니다.

그래서 내 app 클래스의 로컬 myDBManager 변수를 릴리스하지 않습니다. 다른 모든 로컬 변수는 항상 릴리스되며 잘 작동합니다. retainCount를 확인하는 것조차도.

맞아요, 그 클래스의 dealloc에서 클래스의 모든 로컬 변수를 공개해야합니다. 또는 설명 된대로 전역 변수 구문을 사용하는 경우 이러한 변수를 전혀 해제하지 않는 것이 좋습니다. (또는 다른 경우?)

대단히 감사합니다.

답변

2

시나리오에서 myDBManager은 글로벌 변수 또는 로컬 변수가 아니므로 자동 보유 속성 (retain으로 표시)입니다. The Objective-C Programming Language: Declared Properties에 따르면 nonatomic,retain 속성은 dealloc에 명시 적으로 릴리스되어야합니다. 그러나 속성이 합성되면 보조 멤버 변수에 액세스 할 수 없으므로 release을 호출 할 수 없습니다. 속성 설정자를 사용하여 nil으로 설정해야합니다. 그러면 release이 이전 값으로 전송됩니다. 경우에 따라 myDBManager 속성을 AnyOtherClassmyAppDelegate에서 nil으로 설정 하시겠습니까?

업데이트 : @ Don의 대답은 실제로 정확합니다. 속성 설정 자 (self.myDBManager)를 호출하지 않으므로 자동 보유가 실행되지 않습니다. 사용자가 제 실수에서 배울 수 있도록 답을 남겨 둘 것입니다. :-)

2

AnyOtherClass에서 참조 할 때 보유하지 않았으므로 그 시점에서 해제 할 수 없습니다. ivar을 직접 설정하므로 속성의 보유가 작동하지 않습니다. 당신이

self.myDBManager = mainDelegate.myDBManager; 

라고하면 당신은 그것을 유지하는 것입니다 그리고 당신은 클래스를 할당 해제 할 때 해제해야합니다.

그러나 전역 변수 인 경우 AnyOtherClass에서 그렇게 사용하지 않는 이유는 무엇입니까? DB 관리자가 필요할 때 mainDelegate.myDBManager으로 전화하지 않으시겠습니까?

+0

... "mainDelegate.myDBManager"를 사용하려면 "MyAppDelegate * mainDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate];" 그리고 그것은 너무 많은 텍스트를 읽을 수 있습니다. 변수 "myDBManager"는 "AnyOtherClass"의 로컬 변수이므로이 클래스의 모든 메소드에서 쉽게 사용할 수 있습니다. 하지만 그 해명을 가져 주셔서 감사합니다! 따라서 ivar이 "self.xx"없이 할당되면 그냥 풀어 내지 않습니다! (확실히 할당 된 경우 릴리스해야하지만 다른 경우는 해당) 맞습니까? – user387184

+0

아니요, 속성을 'retain'으로 선언하면 항상 유지 한 다음 dealloc에서 해제해야합니다.그렇게하면 클래스에서 직접 설정했는지 또는 속성이 호출 되든 관계없이 일관된 동작을 얻을 수 있습니다. 실제로'self.property'를 사용하여 기대했던대로 작동하는지 확인해야합니다. 그러나 당신이 무엇을해야하는지에 대한 자세한 설명은 Franci의 답변을 참조하십시오. – Don

+0

더 명확히하기 위해서 : 당신이 속성을 사용하지 않는다면, 다음과 같이 변경해야합니다 :'myDBManager = mainDelegate.myDBManager;'this :'myDBManager = [mainDelegate.myDBManager retain];'그러나 여전히'self.myDBManager = mainDelegate.myDBManager; ' – Don

관련 문제