2015-09-19 13 views
6

Đang cố gắng để tải HTML từ một dịch vụ web vào một webview, tôi nhận được lỗi này:Tham chiếu đến bất động sản trong việc đóng cửa yêu cầu rõ ràng 'tự'. để làm cho ngữ nghĩa chụp rõ ràng

Reference to property 'webviewHTML' in closure requires explicit 'self.' to make capture semantics explicit

có nghĩa là gì, và làm thế nào tôi có thể tải các chuỗi HTML vào xem web của tôi?

func post(url: String, params: String) { 

    let url = NSURL(string: url) 
    let params = String(params); 
    let request = NSMutableURLRequest(URL: url!); 
    request.HTTPMethod = "POST" 
    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      print("error=\(error)") 
      return 
     } 

     var responseString : NSString!; 
     responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     webviewHTML.loadHTMLString(String(responseString), baseURL: nil) 
    } 
    task.resume(); 
} 

Trả lời

6

Trước khi trả lời câu hỏi này, bạn phải biết chu trình bộ nhớ là gì. Xem Resolving Strong Reference Cycles Between Class Instances From Apple's documenation


Bây giờ bạn biết những gì một chu kỳ bộ nhớ là:

lỗi Đó là Swift trình biên dịch nói cho bạn

"Hey the NSURLSession closure is trying to keep webviewHTML in the heap and therefor self ==> creating a memory cycle and I don't think Mr.Clark wants that here. Imagine if we make a request which takes forever and then the user navigates away from this page. It won't leave the heap.I'm only telling you this, yet you Mr.Clark must create a weak reference to the self and use that in the closure."

Để biết thêm thông tin, xem this moment của Stanford nhiên.

Đúng Mã

func post(url: String, params: String) { 

    let url = NSURL(string: url) 
    let params = String(params); 
    let request = NSMutableURLRequest(URL: url!); 
    request.HTTPMethod = "POST" 
    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding) 

    weak var weakSelf = self // ADD THIS LINE AS WELL 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      print("error=\(error)") 
      return 
     } 

     var responseString : NSString!; 
     responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 

     weakSelf.webviewHTML.loadHTMLString(String(responseString), baseURL: nil) 
     // REFER to webviewHTML using weakSelf!!!!!! 
    } 
    task.resume(); 
} 

Đối với chi tiết chuyên sâu, xem này Shall we always use [unowned self] inside closure in Swift

+1

Câu trả lời hay và cảm ơn bạn - điều này có ý nghĩa hơn bây giờ. – ThisClark

8

Sử dụng self là một sự thừa nhận rõ ràng về tham khảo (còn gọi là chụp) một cấu trúc (lớp/struct/enum) trong một đóng cửa, ngụ ý được rằng self sẽ không được deallocated cho đến khi nói đóng cửa là deallocated.

Khi bạn nghĩ về nó, self có thể rất tốt được suy ra, (vì nó là, khi bạn sử dụng webviewHTML bên ngoài đóng cửa), nhưng nó là một cố ý quyết định thiết kế không để suy ra nó, như Swift là một ngôn ngữ đầu tiên an toàn.

+0

Có lẽ, nhưng điều này làm giảm mức độ trừu tượng và giảm đều đặn trong các ngôn ngữ. Hơn nữa, nó chỉ an toàn hơn vì việc đếm tham chiếu được sử dụng. –

Các vấn đề liên quan