Là một người mới biết về Objective-C, ai đó có thể cho tôi cái nhìn tổng quan về việc giữ lại, gán, sao chép và bất kỳ ai khác mà tôi đang thiếu, tuân theo chỉ thị @property không? Họ đang làm gì và tại sao tôi lại muốn sử dụng cái này hơn cái khác?
Là một người mới biết về Objective-C, ai đó có thể cho tôi cái nhìn tổng quan về việc giữ lại, gán, sao chép và bất kỳ ai khác mà tôi đang thiếu, tuân theo chỉ thị @property không? Họ đang làm gì và tại sao tôi lại muốn sử dụng cái này hơn cái khác?
Câu trả lời:
Bài viết được liên kết bởi MrMage không còn hoạt động. Vì vậy, đây là những gì tôi đã học được trong quá trình mã hóa (rất) thời gian ngắn của mình trong Objective-C:
nonatomic so với nguyên tử - "nguyên tử" là mặc định. Luôn luôn sử dụng "nonatomic". Tôi không biết tại sao, nhưng cuốn sách tôi đọc nói "hiếm khi có lý do" để sử dụng "nguyên tử". (BTW: Cuốn sách tôi đọc là cuốn sách "Lập trình iOS" của BNR.)
readwrite so với readonly - "readwrite" là mặc định. Khi bạn @synthesize, cả getter và setter sẽ được tạo cho bạn. Nếu bạn sử dụng "readonly", sẽ không có setter nào được tạo. Sử dụng nó cho một giá trị mà bạn không muốn thay đổi sau khi khởi tạo đối tượng.
giữ lại so với bản sao so với gán
atomic
cũng tệ như tư vấn nonatomic
. Không có lựa chọn nào là "chính xác", vì vậy các nhà thiết kế ngôn ngữ đã chọn cách an toàn hơn cho hai giải pháp. Trong thực tế nonatomic
nói chung là sự lựa chọn tốt hơn vì nó bỏ qua các khóa chủ đề cực kỳ đắt tiền. Lý do duy nhất để sử dụng atomic
là nếu tài sản của bạn có thể được đặt từ nhiều luồng (trong trường hợp bỏ qua nó có thể dẫn đến phát hành quá mức hoặc rò rỉ).
Trước khi bạn biết về các thuộc tính của @property, bạn nên biết việc sử dụng @property là gì.
@property cung cấp một cách để xác định thông tin mà một lớp dự định đóng gói. Nếu bạn khai báo một đối tượng / biến bằng @property , thì đối tượng / biến đó sẽ có thể truy cập được vào các lớp khác đang nhập lớp của nó.
Nếu bạn khai báo một đối tượng bằng cách sử dụng @property trong tệp tiêu đề, thì bạn phải tổng hợp nó bằng cách sử dụng @synthesize trong tệp thực hiện. Điều này làm cho đối tượng KVC tuân thủ . Theo mặc định, trình biên dịch sẽ tổng hợp các phương thức truy cập cho đối tượng này.
phương thức accessor là: setter và getter.
Ví dụ: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Bây giờ trình biên dịch sẽ tổng hợp các phương thức accessor cho tên .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Danh sách các thuộc tính của @property
nguyên tử, không biến đổi, giữ lại, sao chép, chỉ đọc, đọc, ghi, mạnh, getter = phương thức, setter = phương thức, unsafe_unretained
nguyên tử là hành vi mặc định. Nếu một đối tượng được khai báo là nguyên tử thì nó trở nên an toàn cho luồng. Phương tiện an toàn luồng, tại một thời điểm chỉ một luồng của một thể hiện cụ thể của lớp đó có thể có quyền kiểm soát đối tượng đó.
Nếu luồng đang thực hiện phương thức getter thì luồng khác không thể thực hiện phương thức setter trên đối tượng đó. Nó chậm.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
Vì lý do này, việc truy cập vào một tài sản không phải là nguyên tử nhanh hơn so với tài sản nguyên tử.
@property (nonatomic)NSString *name;
Phương thức setter sẽ tăng số lượng giữ lại của đối tượng, do đó nó sẽ chiếm bộ nhớ trong nhóm tự động chạy.
@property (retain)NSString *name;
Ngay cả khi một chuỗi có thể thay đổi được thiết lập và sau đó thay đổi, thì cá thể vẫn nắm bắt bất kỳ giá trị nào nó có tại thời điểm nó được đặt. Không có phương thức setter và getter sẽ được tổng hợp.
@property (copy) NSString *name;
hiện nay,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
Tên sẽ không bị ảnh hưởng.
Trình biên dịch sẽ tạo ra một getter, nhưng không phải là setter.
@property (readonly) NSString *name;
Nó trái ngược với chỉ đọc.
@property (readwrite) NSString *name;
Hãy ghi nhớ giữ lại và gán về cơ bản có thể hoán đổi cho nhau khi bật bộ sưu tập rác.
@property (assign) NSInteger year;
Nó đi kèm với ARC.
@property (nonatomic, strong) AVPlayer *player;
Trong trường hợp thuộc tính Boolean (thuộc tính có giá trị CÓ hoặc KHÔNG), theo thông lệ, phương thức getter sẽ bắt đầu bằng từ Từ là is
@property (getter=isFinished) BOOL finished;
Phương pháp nên kết thúc bằng dấu hai chấm.
@property(setter = boolBool:) BOOL finished;
Một tham chiếu không an toàn tương tự như một tham chiếu yếu ở chỗ nó không giữ cho đối tượng liên quan của nó tồn tại, nhưng nó sẽ không được đặt thành không nếu đối tượng đích bị hủy.
@property (unsafe_unretained) NSObject *unsafeProperty;
Nếu bạn cần chỉ định nhiều thuộc tính, chỉ cần đưa chúng vào danh sách được phân tách bằng dấu phẩy, như sau:
@property (readonly, getter=isFinished) BOOL finished;
@property
trong tệp tiêu đề, thì bạn phải tổng hợp nó bằng cách sử dụng @synthesize
trong tệp thực hiện." Không phải lúc nào. Ví dụ: "Theo mặc định, một thuộc readwrite
tính sẽ được hỗ trợ bởi một biến đối tượng, một lần nữa sẽ được tổng hợp tự động bởi trình biên dịch." Từ doc .
Sau khi đọc nhiều bài viết, tôi quyết định đặt tất cả các thông tin thuộc tính lại với nhau:
- nguyên tử // mặc định
- nonatomic
- mạnh = giữ lại // mặc định
- yếu = không an toàn_unretained
- giữ lại
- gán // mặc định
- không an toàn_unretained
- bản sao
- chỉ đọc
- đọc / ghi mặc định
Dưới đây là một liên kết đến bài viết chi tiết nơi bạn có thể tìm thấy các thuộc tính này.
Rất cám ơn tất cả những người đã đưa ra câu trả lời tốt nhất ở đây !!
Dưới đây là Mô tả mẫu từ Điều
Thí dụ :
@property (retain) NSString *name;
@synthesize name;
Thí dụ:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Giải thích:
Giả sử có một thuộc tính chuỗi nguyên tử được gọi là "name" và nếu bạn gọi [self setName: @ "A"] từ luồng A, hãy gọi [self setName: @ "B"] từ luồng B và gọi [self name] từ luồng C, sau đó tất cả các hoạt động trên các luồng khác nhau sẽ được thực hiện ser seri có nghĩa là nếu một luồng đang thực thi setter hoặc getter, thì các luồng khác sẽ chờ. Điều này làm cho tài sản "tên" đọc / ghi an toàn nhưng nếu một luồng D khác gọi [phát hành tên] đồng thời thì thao tác này có thể tạo ra sự cố do không có lệnh gọi setter / getter nào liên quan ở đây. Điều đó có nghĩa là một đối tượng được đọc / ghi an toàn (ATOMIC) nhưng không phải là luồng an toàn vì các luồng khác có thể đồng thời gửi bất kỳ loại tin nhắn nào đến đối tượng. Nhà phát triển nên đảm bảo an toàn luồng cho các đối tượng như vậy.
Nếu "tên" thuộc tính là không biến đổi, thì tất cả các luồng trong ví dụ trên - A, B, C và D sẽ thực thi đồng thời tạo ra bất kỳ kết quả không thể đoán trước nào. Trong trường hợp nguyên tử, một trong hai A, B hoặc C sẽ thực thi trước nhưng D vẫn có thể thực thi song song.
Thí dụ:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Thí dụ :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Giải thích mạnh mẽ và yếu, nhờ có BJ Homer :
Hãy tưởng tượng đối tượng của chúng ta là một con chó, và con chó đó muốn chạy trốn (bị xử lý). Con trỏ mạnh mẽ giống như một dây xích trên con chó. Miễn là bạn có dây xích gắn vào con chó, con chó sẽ không chạy trốn. Nếu năm người gắn dây xích của họ vào một con chó, (năm con trỏ mạnh vào một đối tượng), thì con chó sẽ không chạy đi cho đến khi tất cả năm dây xích được tách ra. Con trỏ yếu, mặt khác, giống như những đứa trẻ chỉ vào con chó và nói "Nhìn kìa! Một con chó!" Chừng nào con chó vẫn còn trên dây xích, những đứa trẻ vẫn có thể nhìn thấy con chó, và chúng vẫn sẽ chỉ vào nó. Tuy nhiên, ngay sau khi tất cả các dây xích được tháo ra, con chó chạy đi cho dù có bao nhiêu đứa trẻ đang chỉ vào nó. Ngay khi con trỏ mạnh cuối cùng (dây xích) không còn trỏ đến một đối tượng, đối tượng sẽ bị giải phóng và tất cả các con trỏ yếu sẽ bị loại bỏ. Khi chúng ta sử dụng yếu? Lần duy nhất bạn muốn sử dụng yếu, là nếu bạn muốn tránh chu kỳ giữ lại (ví dụ: cha mẹ giữ lại đứa trẻ và đứa trẻ giữ lại cha mẹ để không bao giờ được thả ra).
Thí dụ:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Thí dụ:
@property (nonatomic, assign) NSString *address;
@synthesize address;
không an toàn_unretained
-unsafe_unretained là một vòng loại quyền sở hữu cho ARC biết cách chèn các cuộc gọi giữ lại / giải phóng -unafe_unretained là phiên bản ARC của phép gán.
Thí dụ:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Thí dụ:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
Thuộc tính nguyên tử có thể được truy cập bởi chỉ một chủ đề tại một thời điểm. Đây là chủ đề an toàn . Mặc định là nguyên tử. Xin lưu ý rằng không có từ khóa nguyên tử
Nonatomic có nghĩa là nhiều luồng có thể truy cập vào mục. Đây là luồng không an toàn
Vì vậy, người ta phải rất cẩn thận trong khi sử dụng nguyên tử. Vì nó ảnh hưởng đến hiệu suất mã của bạn
thích liên kết này về các thuộc tính trong object-c trong iOS ...
https://techguy1996.blogspot.com/2020/02/properIES-in-objective-c-ios.html