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];

共通クラスの扱い方に関して考えから違っているのでしょうか?