共通変数や関数をまとめたクラスを他のクラスから操作したい場合
Objective-Cでは共通で扱う変数はAppDelegateで宣言するというのが一般的のようですが、
共通変数と共通関数をまとめたクラスを作成し、
他のクラスから値のset, get、メソッドの呼び出しを行うことはできないのでしょうか?
今までは下記のようにAppDelegateでHogeClassクラスを宣言、インスタンス化。
そのインスタンスのアドレスを共有し他のクラス(VarClass)で使っていました。
(ダメな事ですが何故共有できるのか仕組みを理解できていません・・・)
HogeClass1.h
@interface HogeClass1 : NSObject
@property (nonatomic, retain) NSString *mainTitle;
@property (nonatomic, retain) NSString *mainTitleSub;
@end
HogeClass1.m
#import "HogeClass1.h"
@implementation HogeClass1
- (void)hogeCall {
NSLog(@"in hogeCall");
}
@end
AppDelegate.h
#import "HogeClass1.h"
#import "HogeClass2.h"
#import "HogeClass3.h"
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
HogeClass1 *hc1;
HogeClass2 *hc2;
HogeClass3 *hc3;
HogeClass3 *hc3_sub;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 共通クラスのインスタンス化
hc1 = [[HogeClass1 alloc] init];
hc2 = [[HogeClass2 alloc] init];
hc3 = [[HogeClass3 alloc] init];
hc3_sub = [[HogeClass3 alloc] init];
return YES;
}
@end
VarClass
#import "VarClass.h"
HogeClass1 *hc1;
HogeClass2 *hc2;
HogeClass3 *hc3;
HogeClass3 *hc3_sub;
@implementation VarClass
- (void)viewDidLoad {
// 変数の操作
[hc1 setMainTitle:@"タイトル名"]; // このhc1はAppDelegateクラスでインスタンス化したhc1と同じアドレスを持つ
[hc1 setMainTitleSub:[hc1 mainTitle]];
[hc1 hogeCall];
}
@end
しかしXcode 8 betaで動作確認を行っていたところ、
duplicate symbol _変数名 in:
ファイルのパス
ファイルのパス
ld: 400 duplicate symbol for architecture
clang: error: linker command failed with exit code 1
とエラーが発生し、今までの使い方ができなくなりました。
AppDelegateクラスでインスタンス化したhogeClass1を以下のように使うのでは?と思い試みたのですがインスタンス化されたものを取得できず・・・
AppDelegate *appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
hogeClass1 *hoge1 = *[appdelegate hc1];
共通クラスの扱い方に関して考えから違っているのでしょうか?