을 유지 나는 내 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에서 클래스의 모든 로컬 변수를 공개해야합니다. 또는 설명 된대로 전역 변수 구문을 사용하는 경우 이러한 변수를 전혀 해제하지 않는 것이 좋습니다. (또는 다른 경우?)
대단히 감사합니다.
... "mainDelegate.myDBManager"를 사용하려면 "MyAppDelegate * mainDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate];" 그리고 그것은 너무 많은 텍스트를 읽을 수 있습니다. 변수 "myDBManager"는 "AnyOtherClass"의 로컬 변수이므로이 클래스의 모든 메소드에서 쉽게 사용할 수 있습니다. 하지만 그 해명을 가져 주셔서 감사합니다! 따라서 ivar이 "self.xx"없이 할당되면 그냥 풀어 내지 않습니다! (확실히 할당 된 경우 릴리스해야하지만 다른 경우는 해당) 맞습니까? – user387184
아니요, 속성을 'retain'으로 선언하면 항상 유지 한 다음 dealloc에서 해제해야합니다.그렇게하면 클래스에서 직접 설정했는지 또는 속성이 호출 되든 관계없이 일관된 동작을 얻을 수 있습니다. 실제로'self.property'를 사용하여 기대했던대로 작동하는지 확인해야합니다. 그러나 당신이 무엇을해야하는지에 대한 자세한 설명은 Franci의 답변을 참조하십시오. – Don
더 명확히하기 위해서 : 당신이 속성을 사용하지 않는다면, 다음과 같이 변경해야합니다 :'myDBManager = mainDelegate.myDBManager;'this :'myDBManager = [mainDelegate.myDBManager retain];'그러나 여전히'self.myDBManager = mainDelegate.myDBManager; ' – Don