Używam klasy Reachabiliry Apple w moim projekcie non-arc. A kiedy uruchomię go z instrumentami, aby znaleźć wycieki pamięci, to odwołuje się do metody osiągalności. Oto problem:Nieszczelność pamięci osiągalnej Apple
+ (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress;
{
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)hostAddress);
WReachability* returnValue = NULL;
if (reachability != NULL)
{
returnValue = [[self alloc] init];
if (returnValue != NULL)
{
returnValue->reachabilityRef = reachability;
returnValue->localWiFiRef = NO;
}
}
return returnValue;
}
Występujące przecieki są osiągalne i zwracane. Rozumiem, że SCNetworkReachabilityCreateWithAddress tworzy nową instancję i muszę ją wydelegować, ale dzieje się to dokładnie w dealloc!
- (void)dealloc
{
[self stopNotifier];
if (reachabilityRef != NULL)
{
CFRelease(reachabilityRef);
}
[super dealloc];
}
Co mogę zrobić, aby uniknąć wycieku pamięci?
UPD: Może problem polega na tym, w jaki sposób uzyskuje się możliwość osiągnięcia dostępności? Używam tej metody:
+ (instancetype)reachabilityForInternetConnection;
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress:&zeroAddress];
}
Potem nazwie osiągalności tak:
[[Reachability reachabilityForInternetConnection] startNotifier];
I nie przypisać go do dowolnego obiektu, wystarczy użyć tej linii. Próbowałem zmienić ten nazywa się coś takiego:
Reachability *reachability = [[Reachability reachabilityForInternetConnection] autorelease];
[reachability startNotifier];
Ale po to analizator powiedział mi „zbyt wiele autorelease”.
i analizator i łuk również polegają na konwencjach nazewnictwa –
Daij-Djan, czy mógłbyś wyjaśnić? – Maria
Ponadto właśnie zaktualizowałem pytanie. – Maria