2012-04-07 36 views
31

I'ver tự hỏi, tại sao nó ở phía trước của một NSError, chẳng hạn như dưới đây, chúng ta đặt: &error và không error?Tại sao `&` (dấu và) được đặt trước một số tham số phương thức?

Ví dụ:

NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

Hy vọng bạn có thể giải thích, đây cũng là cách hay chỉ trong một số trường hợp cần thiết này? Cảm ơn.

+1

Đây là * con trỏ C chuẩn * toán tử * unary * '&' là toán tử "address of".Rất nhiều đọc tốt và * hướng dẫn * về chủ đề này, và một vài từ khóa trong câu trước. –

+1

có thể trùng lặp của [Con trỏ trong C: khi nào nên sử dụng dấu và dấu hoa thị] (http://stackoverflow.com/questions/2094666/pointers-in-c-when-to-use-the-ampersand-and-the -asterisk) –

+0

@ user166390 Oh người đàn ông bạn thông minh !! – user3932000

Trả lời

55

Bạn cần lấy địa chỉ error vì chức năng cần sửa đổi nó. error được chuyển qua bằng con trỏ, vì vậy, bạn cần nhà điều hành "lấy địa chỉ" & cho nó.

Thông số truyền C và Mục tiêu-C theo giá trị. Nếu bạn vượt qua error mà không có ký hiệu và phương thức bạn gọi sửa đổi, hàm của bạn thực hiện cuộc gọi sẽ không thấy bất kỳ thay đổi nào, vì phương thức sẽ hoạt động trên bản sao cục bộ của NSError*.

Bạn biết rằng bạn cần một dấu ở phía trước của tham số tương ứng nếu bạn nhìn vào chữ ký của phương pháp này và xem ** có:

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error 
              // ^one     ^^ two 
+5

Giải thích tốt nhất từ ​​trước tới nay. Bạn muốn biết điều này một lúc. –

7

loại Các error tham số là (NSError **), đó là một con trỏ đến một con trỏ đến một NSError. Biến số error mà bạn sử dụng làm đối số có thể được khai báo là NSError *, vì vậy để có được loại phù hợp, bạn phải sử dụng địa chỉ của toán tử để trỏ đến con trỏ (&error). Lý do phương pháp cần một con trỏ đến một con trỏ ở nơi đầu tiên là để nó có thể sửa đổi giá trị của error và có giá trị mới có sẵn cho bạn, người gọi của phương pháp.

6

Về cơ bản, thư mục gốc của sự cố là bản hack cho muốn trả lại đối tượng thứ hai (tùy chọn).

Làm cách nào chúng tôi có thể thực hiện việc này vì chúng tôi chỉ có thể trả lại một thứ? Vâng, chúng tôi có thể trả lại một số loại (return_value, error) tuple, nhưng đó là một chút khó sử dụng. Chúng tôi có thể có nhiều tham số như chúng tôi muốn, chúng tôi có thể làm điều gì đó với những ...

Vì vậy, phương pháp/chức năng không thể sửa đổi thông số của chúng (chính xác, chúng hoạt động với một bản sao, vì vậy bất kỳ sửa đổi nào làm là địa phương). Đó là để nói (vấn đề đồng thời sang một bên) giá trị của fetchRequest trước khi tin nhắn trong câu hỏi của bạn sẽ bằng với giá trị của fetchRequest sau đó. Lưu ý đối tượng được trỏ đến bởi fetchRequest có thể thay đổi, nhưng giá trị của chính bản thân là fetchRequest sẽ không.

Điều này đặt chúng tôi vào một chút ràng buộc. Ngoại trừ, chờ đợi, chúng tôi biết chúng ta có thể vui vẻ lấy giá trị của một tham số và sửa đổi những gì nó trỏ đến! Nếu bạn nhìn vào tuyên bố cho executeFetchRequest:error: bạn sẽ thấy nó mất NSError**. Đó là "một con trỏ đến một con trỏ đến một NSError". Vì vậy, chúng ta có thể khởi tạo một/rỗng lơ lửng NSError*, tìm địa chỉ của nó (với unary & operator), và chuyển nó vào. Phương pháp sau đó có thể gán cho NSError* được chỉ ra bởi điều này.

Thì đấy, chúng tôi có các giá trị trả lại bổ sung tùy chọn.

+0

Cảm ơn lời giải thích. Tôi tin rằng tôi ALMOST hiểu nó. Tôi hiểu một bản sao cục bộ của fetchRequest được thực hiện trong phương thức để làm việc để fetchRequest gốc sẽ không thay đổi. Nhưng tại sao sau đó hiện các đối tượng chỉ bằng cách fetchRequest thay đổi nhưng giá trị của fetchRequest doesnt? – marciokoko

+0

Hãy thử sự tương tự này: Tôi yêu cầu bạn "đếm các tập tin trong hộp 3 trên đó và cho tôi biết có bao nhiêu". Tôi là người gọi và tôi đã đưa cho bạn một con trỏ. Bây giờ bạn có thể làm bất cứ điều gì bạn thích với nội dung của hộp 3 (sửa đổi đối tượng tại con trỏ bạn đã cho), và bạn thậm chí có thể quyết định bạn sẽ bỏ qua những gì tôi đã nói với bạn và nhìn vào hộp 2, nhưng không ảnh hưởng đến giá trị của những gì tôi đã cung cấp cho bạn (ngữ cảnh của người gọi) –

+0

tâm thổi! Đã đồng ý! Đã hiểu ... phải phân tích cú pháp để sử dụng sau này! – marciokoko

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