2009-12-25 63 views
11

我試圖解決NSNetService(名爲「My_Mac」)爲IP與該代碼後臺程序:NSNetService代表沒有被調用

NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp" name:@"My_Mac"]; 
[service setDelegate:self]; 
[service resolveWithTimeout:5]; 

而且在同一個班級,我有這方面的代表方法定義:

- (void)netServiceDidResolveAddress:(NSNetService *)sender 
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict 

這裏的怪部分:既不委託方法被調用,除非我以後運行NSAlert「[服務resolveWithTimeout:5];」。有任何想法嗎?

回答

9

我不確定,但它看起來像請求實際上沒有安排在運行循環出於某種原因。也許嘗試像this來安排它?

NSNetService *service = [[[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp." name:@"My_Mac"] autorelease]; 
[service setDelegate:self]; 
[service scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:@"PrivateMyMacServiceMode"]; 
[service resolveWithTimeout:8.0]; 

愚蠢的問題,但你明確實施NSServiceDelegate協議或只是有方法?

編輯:我有另一個想法,這可能是某種競爭條件(更可能的場景)。代表通常是弱引用。如果你的對象正在退出範圍並被自動釋放,那麼系統最終會得到一個零句柄並且將消息發送到零。在你顯示NSAlert(或者做其他工作)的情況下,你的對象可能只是停留在足夠長的時間,以便讓消息被觸發回去。你能否確認你的物體在整個8秒鐘內保持不動?

+0

感謝您的回覆slf。我試過你的NSRunLoop代碼,但沒有骰子。因爲我的目標是10.5,所以沒有定義正式的NSServiceDelegate協議。 – 2009-12-26 02:21:25

+2

slf:你是對的 - 我關掉GC以確保物體仍然存在,並且代表們被呼叫。現在我只需要追蹤它在哪裏被自動發佈,因爲我已經明確地嘗試保留它,而這並不起作用。感謝您指點我正確的方向! – 2009-12-26 22:26:14

+0

看起來複雜的問題的解決方案通常比你第一次想到的要簡單:) – slf 2009-12-29 17:34:37

23

如果您使用ARC,則需要在某處保留服務對象。 在你的例子中,服務對象很可能超出了作用域,並且在你的代碼的其他地方沒有被引用,所以編譯器會在解析調用之後立即嘗試釋放它。

添加一個屬性:

@property (nonatomic, strong) NSMutableArray *services; 

在您的委託,或任何你使用NSNetService

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser 
      didFindService:(NSNetService *)aNetService 
       moreComing:(BOOL)moreComing 
{ 
    if (!self.services) { 
     self.services = [[NSMutableArray alloc] init]; 
    } 
    [self.services addObject:aNetService]; 
    [aNetService setDelegate:self]; 
    [aNetService resolveWithTimeout:3.0]; 
} 

不要忘了停下來釋放這些服務一旦你完成或擺脫代表:

for (NSNetService* service in self.services) { 
    [service stop]; 
} 
[self.services removeAllObjects]; 
+0

這對我有效! – joshblour 2015-02-14 10:21:56

+0

保留它的作品。但NSNetServiceDelegate方法簽名中的NSNetService參數是否保留該對象?例如**發件人**在 - (無效)netServiceDidResolveAddress:(NSNetService *)發件人 – snowbound 2015-10-02 04:00:10