2016-12-17 54 views
0

目前我正在開發一個應用程序,它使用四種協議在類之間進行通信。三個工作正常,但仍然沒有工作。我已將其設置爲與其他人相同,但委託人始終丟失其ID。我對Objective-C非常陌生,所以我不能深究它的底部。下面是我做的:iOS - 單身人士沒有按照委託人的想法工作

我有委託

@property (weak, nonatomic) id <PlayerProtocol> player; 

和MainViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[Interface sharedInstance] Init]; 
    NSLog(@"Player ID: %@", _player); 
    NSLog(@"viewDidLoad: %@", self); 
} 

- (void)sedPlayer:(id) pointer{ //sed is no typo! 
    _player = pointer; 
    NSLog(@"sedPlayer ID: %@", _player); 
    NSLog(@"sedPlayer: %@", self); 
} 

+ (instancetype)sharedInstance { 
    static dispatch_once_t once; 
    static id sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

在Interface.m(NSObject的)

- (void)Init { 
    [[MainViewController sharedInstance] sedPlayer:self]; 
} 
一個MainViewController.h

當然還有一個protocol.h,但這並不重要,因爲代表會遇到麻煩!當我運行的代碼我得到的控制檯上的輸出如下:

sedPlayer ID: <Interface: 0x1700ab2e0> 
sedPlayer: <MainViewController: 0x100406e30> 
Player ID: (null) 
viewDidLoad: <MainViewController: 0x100409550> 

所以很明顯的是,單不工作作爲MainViewcontroller的情況是不同的。對於單身人士,我使用dispatch_once標準方法,因爲我可以使用其他正常工作的協議。 ARC打開。有沒有人有線索這裏有什麼問題,爲什麼單身人士不工作?

+0

首先你應該使用'時使用'delegate'你,assign'更換strong'的':'@property(強,非原子)id player',其次,請在您的問題中發佈您的整個代碼,我們可以找到問題出在哪裏。 – aircraft

+1

^不,使用'weak'而不是'assign'。 'assign'將會要求你在釋放對象的時候不去引用那個對象,否則當你發送一條消息給(現在是釋放的)對象時你會崩潰。 – AdamPro13

+0

@Hecot是否確定'[MainViewController sharedInstance]'是'MainViewController'的同一個實例,因爲'viewDidLoad'被調用? – AdamPro13

回答

0

下面是我認爲你最終得到了MainViewController的兩個實例的結果。我假設第一個是在導航到與MainViewController關聯的屏幕時創建的。第二個是在Interface.m中撥打[MainViewController sharedInstance]時創建的。

由於視圖控制器的觀點是懶加載(「視圖控制器懶洋洋地裝入了自己的看法。訪問首次加載視圖屬性或創建視圖控制器的看法。」從ViewManagement下Apple docs),你只能看到viewDidLoad: <MainViewController: 0x100409550>日誌一次,當第一個MainViewController被導航並加載視圖。

這裏是我的建議:

既然你做Interface- (void)viewDidLoad初始化,您不妨設置self.player = [Interface sharedInstance]

的代碼會是這個樣子:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.player = [Interface sharedInstance]; 
    NSLog(@"Player ID: %@", _player); 
    NSLog(@"viewDidLoad: %@", self); 
} 

你也應該得到你的MainViewController擺脫- (void)sedPlayer:(id) pointer+ (instancetype)sharedInstance。有一個ViewController單例永遠不是一個好主意,因爲你最終可能會弄亂導航或者導致多個狀態。

有關避免單身一個更深入的文章,你可以檢查objc.io Avoiding Singleton Abuse

+0

看來我已經使它太複雜:) - 感謝您的幫助! – Hecot