2011-05-14 72 views
0

我面臨一個問題:我有兩個視圖控制器,viewController1viewController2。 這是我在viewController1很擔心的方法:需要保留一個CFSocketRef?

-(void)msgToServer:(NSString*)identifier:(NSString *)_username{ 
    NSString *message = [NSString stringWithFormat:@"%@|%@|<END>", identifier, _username]; 
    CFDataRef messageData = (CFDataRef)[message dataUsingEncoding:NSUTF8StringEncoding]; 

    CFSocketSendData(s, NULL, messageData, 0); 
} 

這種方法在viewController1可以正常使用。

現在我從viewController2調用這個方法。我傳遞了兩個參數identifier_username。它完美地生成了字符串,但是當它到達最後一行時,它會忽略s的值 - 這是一個CFSocketRef。 我該怎麼做才能使s保留其價值,即使我在viewController2

viewController2代碼它調用上述方法:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    WatchListViewController *watchListViewController = [[WatchListViewController alloc]init]; 
    [watchListViewController msgToServer:@"PREQ" :userName]; 
} 

預先感謝。

+0

把代碼viewController2其中u呼籲msgToServer – Jhaliya 2011-05-14 09:49:13

+0

您可以在這裏現在檢查viewController2代碼「WatchListViewController」是viewController1 – Mashhadi 2011-05-14 10:13:49

+0

你在哪裏創建'CFSocketRef'這是在's'?你能告訴我那個代碼嗎? – 2011-05-14 17:24:43

回答

0

感謝名單向所有誰幫我以及我以這種方式解決了這個問題: 當我從viewController1推到viewController2我傳遞兩個參數「username」和「s」到viewController2,然後我寫這篇文章的方法在viewController2

-(void)msgToServer:(NSString*)identifier:(NSString *)_username{ 
    NSString *message = [NSString stringWithFormat:@"%@|%@|<END>", identifier, _username]; 
    CFDataRef messageData = (CFDataRef)[message dataUsingEncoding:NSUTF8StringEncoding]; 

    CFSocketSendData(s, NULL, messageData, 0); 
} 

然後我在相同的視圖控制器中調用此方法,它完美的工作。我認爲這是我找到的唯一解決方案。如果任何機構可以使它更有效率,那麼你是受歡迎的。 :)

+0

套接字引用不能被保留cz這就像一些int類型,所以它的值不能被保留,即使你不能保留在它的屬性中,所以當我們寫入賦值的時候,我們不能保留它。如果我們必須在某處使用它,那麼我們必須將它作爲參數傳遞。這是保持其價值的唯一途徑。 – Mashhadi 2011-05-18 05:32:02

+0

不,這是錯誤的。你錯過的是CFRetain()的存在,它通常保留在CF(任何)Ref上 – Adam 2013-07-17 14:46:55

0

您可以使用NSObjectretain功能。

- (id)retain 

See in Apple Documentation

也有內存管理編程指南中一看就Object Ownership and Disposal

編輯:

與下面的代碼

嘗試你可能有問題與函數原型,而不是保留。

以下使用 -(void)msgToServer:(NSString*)identifier withUsername:(NSString *)_username;

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    WatchListViewController *watchListViewController = [[WatchListViewController alloc]init]; 
    [watchListViewController msgToServer:@"PREQ" withUsername:userName]; 
} 

-(void)msgToServer:(NSString*)identifier  withUsername:(NSString *)_username{ 
    NSString *message = [NSString stringWithFormat:@"%@|%@|<END>", identifier, _username]; 
    CFDataRef messageData = (CFDataRef)[message dataUsingEncoding:NSUTF8StringEncoding]; 

    CFSocketSendData(s, NULL, messageData, 0); 
} 
+0

@Mashhadi:檢查更新的答案.. – Jhaliya 2011-05-14 10:19:40

+0

我絕對正確,但保留僅用於保留對象。 &「s」是一個CFSocketRef。這是一個推薦。我們聲明它像:CFSocketRef s;那麼我們如何保持其價值呢? – Mashhadi 2011-05-14 10:25:48

+0

它的工作方式weell與同類中的方法,但當我從viewController2調用它,然後它錯過了「S」的價值和崩潰在該行。現在我認爲必須將該值傳遞給viewController2,然後必須將其發送回viewController1。 – Mashhadi 2011-05-14 10:44:03

相關問題