Mục tiêu C - Chỉ định, Sao chép, Giữ lại


83

Tôi mới sử dụng Objective C. Tôi có kiến ​​thức cơ bản về C, bao gồm cả khái niệm về con trỏ. Tôi có hai câu hỏi cơ bản:

  1. Ai đó có thể giải thích sự khác biệt giữa gán, sao chép và giữ lại bằng một số phép loại suy không?
  2. Làm thế nào để bạn xử lý một hàm trả về biến con trỏ và làm cách nào để bạn thực hiện nhắn tin thông qua một con trỏ trả về?

Câu trả lời:


126

Câu trả lời cập nhật cho tài liệu đã thay đổi

Thông tin hiện được phổ biến trên một số hướng dẫn trong tài liệu. Đây là danh sách các bài đọc cần thiết:

Câu trả lời cho câu hỏi này bây giờ hoàn toàn phụ thuộc vào việc bạn đang sử dụng ứng dụng được quản lý bằng ARC (mặc định hiện đại cho các dự án mới) hay buộc quản lý bộ nhớ thủ công.

Gán so với Yếu - Sử dụng gán để đặt con trỏ của thuộc tính đến địa chỉ của đối tượng mà không giữ lại nó hoặc quản lý nó; sử dụng yếu để có thuộc tính trỏ đến nil tự động nếu đối tượng được gán cho nó được phân bổ. Trong hầu hết các trường hợp, bạn sẽ muốn sử dụng yếu để không cố gắng truy cập đối tượng được phân bổ (truy cập bất hợp pháp địa chỉ bộ nhớ - " EXC_BAD_ACCESS") nếu bạn không thực hiện dọn dẹp thích hợp.

Giữ lại so với Sao chép - Thuộc tính đã khai báo sử dụng giữ lại theo mặc định (vì vậy bạn có thể đơn giản bỏ qua hoàn toàn) và sẽ tự động quản lý số lượng tham chiếu của đối tượng cho dù đối tượng khác được gán cho thuộc tính hay được đặt thành nil; Sử dụng bản sao để tự động gửi cho đối tượng mới được gán một -copythông báo (sẽ tạo một bản sao của đối tượng được truyền và thay vào đó gán bản sao đó cho thuộc tính - hữu ích (thậm chí là bắt buộc) trong một số trường hợp mà đối tượng được chỉ định có thể được sửa đổi sau khi được đặt là thuộc tính của một số đối tượng khác (có nghĩa là sửa đổi / đột biến cũng sẽ áp dụng cho thuộc tính).


2
Cảm ơn anh bạn Tôi đã đọc những điều cơ bản từ Apple Dev, về sự phát triển hiện tại của tôi Gặp khó khăn trong việc quản lý bộ nhớ "bị lỗi trong objc_msgSend ()" Vì vậy, tôi chỉ nghĩ đến việc sửa đổi hiểu biết của mình về các thuộc tính. stackoverflow.com/questions/4506205/…
Sabha B

2
Chỉ cần lưu ý, liên kết đến câu trả lời đi đến một trang chung chung "Không tìm thấy trang" trên trang web của Apple. Sau đó nó chuyển hướng đến "Mac Developer Library" câu trả lời SO này có thông tin hữu ích: stackoverflow.com/questions/2255861/...
hippeelee

1
Đây là một loại khó cập nhật vì tài liệu đã thay đổi và nó không còn ở một nơi thuận tiện. Phản hồi đã được gửi đến nhóm tài liệu của Apple.
Joshua Nozzi,

33

Các trình quản lý bộ nhớ Hướng dẫn từ Thư viện tham khảo iOS có căn bản về assign, sao chép, và giữ lại với loại suy và ví dụ.

copy Tạo một bản sao của một đối tượng và trả về nó với số lưu giữ là 1. Nếu bạn sao chép một đối tượng, bạn sở hữu bản sao đó. Điều này áp dụng cho bất kỳ phương thức nào có chứa bản sao từ mà “bản sao” đề cập đến đối tượng được trả về.

giữ lại Tăng số lượng lưu giữ của một đối tượng lên 1. Có quyền sở hữu đối tượng.

release Giảm số lượng lưu giữ của một đối tượng xuống 1. Thu hồi quyền sở hữu đối tượng.


Cảm ơn bạn đã trả lời. Bạn có thể vui lòng giải thích 1.ClassA có một thuộc tính được gọi là - (Class B *) functionName; 2.ClassB có phương thức - (void) setHeight; Giao diện 3.ClassC Tôi đã khai báo ClassA * tempA là giữ lại. 4. Thực hiện lớp C trong phương thức khởi tạo Tôi có câu lệnh này ClassB * tempB = tempA. Chức năngName; 5.Khi tôi cố gắng gửi một tin nhắn (tempB. SetHeight;) trên dòng tiếp theo của quá trình khởi tạo tempB, chương trình của tôi hoạt động tốt.
Sabha B

6. nhập cùng một câu lệnh (tempB. SetHeight;) vào một số hàm và gọi cùng một hàm mà chương trình của tôi bị Crashed trong objc_msgSend ().
Sabha B

8
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)

2
Một lời giải thích xung quanh sẽ cải thiện nghiêm túc câu trả lời của bạn.
zx485

4
  1. chỉ định

    • gán là một thuộc tính thuộc tính mặc định
    • gán là một thuộc tính thuộc tính cho trình biên dịch biết cách tổng hợp việc triển khai setter của thuộc tính
  2. sao chép:

    • bản sao là bắt buộc khi đối tượng có thể thay đổi
    • copy trả về một đối tượng mà bạn phải giải phóng rõ ràng (ví dụ: trong dealloc) trong các môi trường không được thu gom rác
    • bạn cần giải phóng đối tượng khi hoàn thành nó vì bạn đang giữ lại bản sao
  3. giữ lại:

    • chỉ định giá trị mới sẽ được gửi "-retain" khi chuyển nhượng và giá trị cũ được gửi "-release"
    • nếu bạn viết giữ lại nó sẽ tự động hoạt động như mạnh
    • Các phương pháp như "phân bổ" bao gồm một "giữ lại" ngầm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.