hata

2011-08-05 30 views
27

Ben ARC benim soket istemci dönüştürme ediyorum "geri yazımı için __autoreleasing parametreye yerel olmayan nesnenin adresini Geçme":hata

- (id)initWithHostname:(NSString *)hostname AndPort:(NSInteger)port 
{ 
    if((self = [super init])) 
    { 
     oBuffer = [[NSMutableData alloc] init]; 
     iBuffer = [[NSMutableData alloc] init]; 

     iStream = [[NSInputStream alloc] init]; 
     oStream = [[NSOutputStream alloc] init]; 

     [NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream]; 

     ... 
    } 

    return self; 
} 

i got hatadır:

file://localhost/...foo.m: error: Automatic Reference Counting Issue: Passing address of non-local object to __autoreleasing parameter for write-back

/"& oStream" "& iStream"

[NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream]; 

Herhangi bir yardım bu çizgisinde?

+0

ARC, geliştirici forumlarında bu sormak daha iyi yapabilir ne kadar yeni Verilen .m dosyanın aynı olarak ilan edilmesi gerektiğini Not . – jtbandes

+0

Elbette, elbette;) – kilianc

cevap

37

Bu hata, genellikle yerel olmayan değişken adresin bir yönteme aktarılmasından kaynaklanır. Değişkenin, __oldümelement parametresi kullanılırken, değişkenin __strong varsayılan olarak bildirilmesi nedeniyle, __strong olarak çağrılan yöntemin parametresini bildirir. böyle: -(void)method:(id * __strong *)para.
kafa dosyası (.h dosyası) yöntemi

+0

Bu öneri, sorunu tamamen çözdü. Benim durumumda, ARC kodu, ivar değerini ve ivar'ı yerel geçici değişkenlere atamanın diğer geçici çözümünü serbest bırakır, onu hedef işleve iletir ve derleyicinin hatalarını çözdüğü halde @Rudy Velthuis tarafından önerilen şekilde ivar'a yeniden atar. EXC_BAD_ACCESS hatası, çalışma zamanı olarak bırakılan bellek, hala serbest bırakıldıktan sonra ARC olmayan kodun içine sarkan ve başvuruyor. – Rajaraman

12

iStream ve oStream değişkenlerini ayırmamalı ve başlatmamalısınız. Almaları gerekiyor. ARC olmadan, bu sadece fark edilmeden gider iki bellek sızıntısı oluşturur. Şimdi derleyiciniz ARC kullanıyor ve sonra önemli. Alıcı değişkenleri yerel olmalıdır:

Yani deneyin:
NSInputStream *iStream; 
    NSOutputStream *oStream; 

    oBuffer = [[NSMutableData alloc] init]; 
    iBuffer = [[NSMutableData alloc] init]; 

    [NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream]; 

, AFAICT çalışması gerektiğini. Ama not: Bunu burada test edemem.

+0

Teşekkür ederim Rudy, kod çalışıyor. Ama biraz açıklamaya ihtiyacım var. "IStream" ve "oStream" için örnek işaretçilerim yerine iki yerel işaretçiyi kullanıyorsunuz, bu yüzden akışlarım için bir referans başvurusu yapılamıyor mu? Bunun nedeni NSStream akışını istediği zaman değiştirebilir veya ne olabilir? – kilianc

+0

@kilianc: Bilmiyorum. Hata iletisi yerel olmayan değişkenler hakkında şikayet etti, bu yüzden yerel olmaları gerektiğini varsaydım. Bunu test etmek için bir ARC derleyicim yok. O zaman muhtemelen bunları mülklere veya ivarlara atayabilirsiniz. –

+0

Burada daha iyi bir cevap var: http://stackoverflow.com/questions/7415301/automatic-reference-counting-issue-passing-address-of-non-local-object-to-aut – nduplessis

13

İki yerel değişken oluşturun, bunların adreslerini yönteme iletin ve ardından değerlerini döndürdükten sonra ivarlara atayın.