2011-05-14 70 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

相关问题