Đối với bất kỳ ai gặp phải câu hỏi này, có vẻ như quan sát của Matt không áp dụng cho facebook-iphone-sdk mới nhất. Các thông số được giữ lại không còn rõ ràng trong phương pháp có liên quan:
+ (FBRequest *)getRequestWithParams:(NSMutableDictionary *) params
httpMethod:(NSString *) httpMethod
delegate:(id<FBRequestDelegate>) delegate
requestURL:(NSString *) url {
FBRequest* request = [[[FBRequest alloc] init] autorelease];
request.delegate = delegate;
request.url = url;
request.httpMethod = httpMethod;
request.params = params;
request.connection = nil;
request.responseText = nil;
Vì vậy, quản lý bộ nhớ cho các đại biểu rơi trở lại việc kê khai tài sản trong file .h:
@property(nonatomic,assign) id<FBRequestDelegate> delegate;
Điều này có nghĩa một vụ tai nạn tại là có thể vì đối tượng đại biểu có thể được deallocated trước khi FBRequest được hoàn thành.
Cập nhật:
Sự chỉnh sửa có được đề xuất trong this câu hỏi để cho phép hủy bỏ FBRequests chờ giải quyết.
Cập nhật 2:
Để tránh một vụ tai nạn trong trường hợp các đại biểu được deallocated trước FBRequest kết thúc, bạn cần phải hủy bỏ kết nối các hoạt động FBRequest như bạn deallocate các đại biểu (mà về cơ bản là những gì Matt gợi ý trong câu hỏi được liên kết). Tuy nhiên (tôi không chắc chắn nếu điều này là mới), bạn có thể làm điều này trực tiếp đến FBRequest vì nó cho thấy nó là tài sản NSURLConnection.Vì vậy, nếu bạn giữ lại đối tượng FBRequest của bạn trong một sở hữu:
@property (nonatomic, retain) FBRequest *myRequest;
và lưu các đối tượng yêu cầu khi bạn thực hiện cuộc gọi của bạn:
self.myRequest = [facebookObj requestWithGraphPath:@"me" andDelegate:self];
bạn có thể làm sạch tất cả mọi thứ trong dealloc của bạn:
- (void)dealloc
{
if(myRequest) {
[[myRequest connection] cancel];
[[myRequest release];
}
...
[super dealloc];
}
Rõ ràng, bạn có lẽ cũng nên giải phóng và nil thuộc tính FBRequest trong các phương thức ủy nhiệm khi bạn đã xử lý phản hồi.
Cảm ơn, Bạn đã lưu ngày của tôi. –