Tôi sử dụng lớp Reachabiliry của apple trong dự án phi hồ quang của tôi. Và khi tôi chạy nó với các công cụ để tìm rò rỉ bộ nhớ, nó đề cập đến phương pháp Reachability. Đây là vấn đề:Rò rỉ bộ nhớ khả năng truy cập của 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;
}
Đối tượng bị rò rỉ là khả năng tiếp cận và trả lạiValue. Tôi hiểu rằng SCNetworkReachabilityCreateWithAddress tạo một phiên bản mới và tôi phải CFRelease nó, nhưng nó xảy ra ngay trong dealloc!
- (void)dealloc
{
[self stopNotifier];
if (reachabilityRef != NULL)
{
CFRelease(reachabilityRef);
}
[super dealloc];
}
Vậy tôi có thể làm gì để tránh rò rỉ bộ nhớ ở đây?
UPD: Có thể vấn đề là cách khả năng tiếp cận được gọi? Tôi sử dụng phương pháp này:
+ (instancetype)reachabilityForInternetConnection;
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress:&zeroAddress];
}
Sau đó, tôi gọi reachability như thế này:
[[Reachability reachabilityForInternetConnection] startNotifier];
Và đừng gán nó vào bất kỳ đối tượng, chỉ cần sử dụng dòng này. Tôi đã cố gắng để thay đổi điều này các cuộc gọi đến một cái gì đó như:
Reachability *reachability = [[Reachability reachabilityForInternetConnection] autorelease];
[reachability startNotifier];
Nhưng sau khi phân tích này nói với tôi "quá nhiều autorelease".
và phân tích & arc cũng dựa vào quy ước đặt tên –
Daij-Djan, bạn có thể giải thích không? – Maria
Ngoài ra, tôi vừa cập nhật câu hỏi. – Maria