2012-07-18 4 views
6

가능한 중복 : 저장하는 "글로벌"개체


How or where should I store object instances that I require globally within my iOS app?

내가 (거의 모든 응용 프로그램 화면 사용) 일부 글로벌 개체가 주로 그들이 직후에 생성됩니다 응용 프로그램이 시작됩니다. 내 모든 ViewController에서이 객체에 액세스 할 수 있습니다 (ViewController 만 해당). 어디에서 그것을 저장?

나는 @propertyAppDelegate에 대해 생각하지만 (나는 틀릴 수도있다) 이것은 추한 해결책이다.

개체가 매우 복잡 할 수 있습니다. 이것은 단순한 형식이 아닙니다.

+1

[iOS 앱에서 전 세계적으로 필요한 객체 인스턴스를 어떻게 저장해야합니까?] (http://stackoverflow.com/q/5721990/), [iOS 앱의 전역 변수] (http : //stackoverflow.com/q/9096712/), [어디에서 전역 변수를 만들 수 있습니까?] (http://stackoverflow.com/q/9593594/), [나는 아이폰 OS에서 전역 변수를 저장할 수있는 방법] (HTTP ://stackoverflow.com/q/9960982/), 아이폰 데브 : 글로벌 변수 (http://stackoverflow.com/q/7368820/), 글로벌 변수 ObjC (http://stackoverflow.com/q/ 1,643,467 /), 글로벌 변수를 유지하는 최상의 방법 (http://stackoverflow.com/q/3456981/) –

답변

10

전역 개체에 액세스하기위한 클래스 메서드를 사용하여 클래스에 배치하고 이러한 개체를 준비하기 위해 +(void)load을 구현 한 다음 정적 변수에 저장하여 전역 개체에 액세스 할 수있게 할 수 있습니다.

헤더 :

@interface GlobalObjects 
+(void)load; 
+(MyObject1*)myObject1; 
@end 

구현 :

#import "GlobalObjects.h" 
static MyObject1* _myObject1 = nil; 
@implementation GlobalObjects 
+(void)load { 
    _myObject1 = [[MyObject1 alloc] init]; 
} 
+(MyObject1*)myObject1 { 
    return myObject1; 
} 
@end 

사용 : 또한 게으른 초기화에 대한 방법 내부 변수 정적을 만들 수

MyObject1 *shared = [GlobalObjects myObject1]; 

.

+0

... 아마도 당신이 당신의 개체에 대한 자세한 내용을 제공해야 더 많은 도움을 ...있는 NSDictionary를 사용하고 자신의 "이름"(사전 키)에 의해 각 개체에 액세스 할 수 있습니다. GlobalObjects 클래스가 있으면 모든 클래스에 구현해야합니까? 클래스 메소드로 설정하면 클래스에 인스턴스를 작성할 필요가 없습니다. – Kuba

+0

@SimpleMan'GlobalObjects.h'를 가져 오기만하면됩니다. 모든 메소드가 * 클래스 메소드 * ('+'에주의)이므로'GlobalObjects '를 인스턴스화 할 필요가 없습니다. '+ (void) load' 메소드는 클래스가 코코아 런타임에로드 될 때 자동으로 호출되므로 호출 할 필요가 없습니다. – dasblinkenlight

+0

고마워, 도움이된다 – Kuba

3

네, 저는 App Delegate의 속성을 사용하고, sharedApplication 대리자 속성을 캐스팅하여 액세스합니다. 이 도움이

__weak AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

희망,

조나단 AppDelegate에의

1

@property 좋은 솔루션입니다. 싱글 톤을 사용할 수도 있습니다.

+0

http://www.hollance.com/2012/02/dont-abuse-the-app-delegate/ – fabb

+0

http://stackoverflow.com/questions/569940/whats-the-best-way-to-communicate-between-view-controllers – fabb

1

많은 수의 개체가있는 경우 응용 프로그램 대리인이 좋습니다.

그렇지 않으면 모든 글로벌 데이터를 포함하는 일종의 "모델 개체"를 만들 수 있습니다.

또는 구조가있는 경우 코어 데이터와 함께 저장할 수 있습니다.

하지만 내가 말했듯이, 개체가 두 개인 경우 앱 위임자가 정상적으로 작동합니다.

+0

는 "그들은 모두에서 어떤 구조를 가지고있는 경우"에 의해 무엇을 의미. 내 경우에는 NSArray에 내 객체 (단순한 유형이 아님)가 포함됩니다. – Kuba

+0

핵심 데이터는 데이터베이스입니다. 기본적으로 데이터베이스를 구축 할 것을 제안하는 구조를 갖고 있다면 말입니다. 전체 옵션 집합 만 표시하면 더 나은 옵션을 더 잘 결정할 수 있습니다. 문제는 데이터에 어떻게 액세스 할 것인가입니다. NSArray가 완벽하면 인덱스를 기준으로 객체에 액세스 할 수 있습니다. 당신은 내가 어떤 부분을 이해하지 못하는 – sergio

1

보기 컨트롤러에서만 사용하는 경우 공유 컨트롤러에 대한 액세스가 필요한 최상위보기 컨트롤러에 저장하는 것이 좋습니다 (새 컨트롤러를 만들거나 밀 때 참조 카운트 된 속성 설정).

이러한 방식으로 마스터보기 컨트롤러가 해당보기/컨텐츠 컨트롤러/모델을 가진 상세보기 컨트롤러를 채우고 있다고 생각할 수 있습니다.

이것은 글로벌 자격 (및 부담)에서 벗어나고 있습니다.

+0

이것은 좋은 충고이지만 모든 뷰 컨트롤러에이 작업을 수행하면 다른 객체 인스턴스를 만들어야합니다. 내가 맞습니까? 이 객체를 한 번 설정하고 모든 ViewController에서이 객체에 액세스하려고합니다. – Kuba

+0

@SimpleMan VC (View Controller) 사이의 참조 (NSArray에 대한 참조)를 공유하기 만하면됩니다. 배열의 요소는 복사되지 않습니다. 이 배열을 위해 VC에서 새로운 속성을 선언해야하지만, 그것은 대부분의 날에 전역 NSArray보다 덜 나쁜 것입니다. VC와 그들의 견해간에 문서 나 모델을 공유하는 것을 상상해보십시오. 그래서, 아니, 당신은 어떤 추가 개체 (새로운 배열 또는 요소)를 만들 필요가 없습니다 -하지만 당신이 공유 객체에 대한 벤처 캐피탈의 특성 (저장)를 선언해야합니까, 당신은 그 속성을 설정해야 할 것입니다 VC를 만들거나 밀 때. – justin

관련 문제