Tôi đang tìm kiếm ứng dụng mẫu của Apple EditableDetailView và nhận thấy rằng trong một trong các trình điều khiển của chúng, chúng đang thiết lập một thể hiện thuộc tính NSString với (nonatomic, copy). Khi nào một người sử dụng bản sao thay vì giữ lại? Đây có phải là để họ có thể tạo một bản sao duy nhất mà không ảnh hưởng đến dữ liệu hiện có không?NSString @property, sử dụng bản sao thay vì giữ lại
Trả lời
Có, nó sao cho nó có thể tạo một bản sao duy nhất mà không ảnh hưởng đến dữ liệu hiện có. Các setters tổng hợp về cơ bản giống như thế này:
// For @synthesize(nonatomic, retain) foo:
- (void) setFoo(NSFoo *theFoo)
{
[theFoo retain]; // retain new value
[foo release]; // release old value, if any
foo = theFoo; // assign new value
}
// For @synthesize(nonatomic, copy) foo:
- (void) setFoo(NSFoo *theFoo)
{
NSFoo* newFoo = [theFoo copy]; // make copy
[foo release]; // release old value, if any
foo = newFoo; // assign new value
}
Lưu ý thứ tự của các hoạt động ở đây là rất quan trọng - giá trị mới phải được giữ lại/sao chép trước khi giá trị cũ được phát hành, trong trường hợp tự chuyển nhượng. Nếu bạn phát hành đầu tiên và sau đó gán tài sản cho chính nó, bạn có thể deallocate các giá trị một cách tình cờ. Cũng lưu ý rằng nếu giá trị cũ là nil
, gửi tin nhắn release
là ok, vì việc gửi tin nhắn đến một đối tượng nil
được cho phép rõ ràng và không làm gì cả.
Lựa chọn giữ lại so với sao chép chỉ xác định xem thuộc tính của đối tượng có cùng giá trị với những gì bạn đang đặt. Xét đoạn mã sau:
// suppose the 'foo' property is declared 'retain' and the 'bar' property is
// declared 'copy'
NSFoo *foo = ...;
NSBar *bar = ...;
someObject.foo = foo;
someObject.bar = bar;
[foo changeInternalState]; // someObject.foo also changes, since it's the same object
[bar changeInternalState]; // someObject.bar does NOT change, since it's a copy
có thể có lỗi đánh máy trong dòng cuối cùng của bạn. nơi //someObject.foo KHÔNG ... nên //someObject.bar KHÔNG –
Để có thể gọi 'copy' trên đối tượng Lớp tùy chỉnh, bạn phải ghi đè phương thức' copyWithZone: '. – thesummersign
Hãy nhớ rằng có một NS Biên Đổi String. Sẽ rất tệ nếu có thể thay đổi nội dung của chuỗi mà một số đối tượng khác sở hữu (bằng cách xóa một nửa số ký tự của nó), đặc biệt nếu bạn không nhận ra mình đang ảnh hưởng đến một đối tượng khác. Vì vậy, nó là tốt đẹp cho các đối tượng khác để làm cho bản sao của riêng mình.
Bạn có thể nói “tốt, tại sao tôi không sao chép chuỗi trước khi gán nó ở đó?”. Có lẽ đối tượng muốn một chuỗi có thể thay đổi và bạn không thể thay đổi được. Nếu bạn phải sao chép chuỗi đầu tiên, sau đó bạn phải tìm kiếm loại chuỗi nó muốn trong tài liệu hoặc tiêu đề của nó, sau đó thực hiện đúng loại bản sao (mọi thời điểm). Bằng cách này, bạn chỉ cần nói other.string = myString
và nó làm cho bất kỳ loại bản sao nó muốn-bạn không phải lo lắng về nó.
(Đối với một số lý do, bài này được xuất hiện trên các câu hỏi theo dõi tôi đang cố gắng để trả lời) Re:
bạn đã có nghĩa là tôi phải sao chép 'các foo' đối tượng trước khi thả 'foo' ?? nhưng whats vấn đề nếu tôi relaese 'foo' trước khi sao chép 'các foo' ?? bởi vì họ là hai khác nhau đối tượng tôi có thể không hiểu tại sao phát hành một ảnh hưởng khác !!!!
Hầu hết thời gian, bạn là chính xác. Nếu chúng là, trên thực tế, hai đối tượng riêng biệt, nó sẽ không thành vấn đề. Vấn đề nằm ở khả năng bạn đang gán cùng một đối tượng vào chính nó. Nếu bạn muốn nói
[myObject setFoo: moof];
[myObject setFoo: moof];
Sau đó, lần thứ hai bạn đã thực hiện, bạn sẽ phát hành trước khi bạn sao chép. Trong thời điểm can thiệp, có thể là nếu số lượng giữ lại của moof là 0 thì moof sẽ bị xóa, và bạn sẽ không có gì để sao chép trong bước tiếp theo. Foo bây giờ sẽ là không.
Điều này có khả năng xảy ra không? Có lẽ nhiều hơn bạn nghĩ. Có chắc chắn là khi người dùng có thể nhấp vào nút "cập nhật" hai lần, ví dụ.
Tôi hy vọng điều này là dễ hiểu và hữu ích.
Stack Overflow là một trang hỏi và trả lời, không phải là diễn đàn. Câu trả lời, trong đó cả câu hỏi này và "câu hỏi" bạn muốn phản hồi, được sắp xếp theo phiếu bầu theo mặc định. Của bạn có 0 và câu trả lời khác (mà bây giờ đã bị xóa) kết thúc ở -3, do đó, bạn xuất hiện cao hơn (cho những người trong chúng ta với đủ nghiệp lực để xem khác ở tất cả). Cách đúng đắn sẽ là bình luận về câu trả lời khác, nhưng điều đó đòi hỏi 50 điểm danh tiếng mà bạn không có. (Thêm câu trả lời của bạn quá sâu và được định dạng phong phú để phù hợp với nhận xét.) Không có cách nào đúng trong trường hợp của bạn. –
- 1. Làm thế nào để tạo thuộc tính NSString NSManagedObject bằng "sao chép" thay vì "giữ lại"?
- 2. @property định nghĩa với ARC: mạnh mẽ hoặc giữ lại?
- 3. Khi nào tôi nên sử dụng NSURL thay vì NSString và ngược lại?
- 4. Khi nào sử dụng giữ lại và khi nào sử dụng bản sao
- 5. Tại sao sử dụng @property trong D?
- 6. Giữ bản sao trong khi sử dụng array_diff
- 7. Bản sao C và giữ lại mục tiêu
- 8. Tại sao thuộc tính được khai báo sử dụng cả giữ lại và chỉ đọc?
- 9. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 10. Tại sao addSubview lại không giữ lại chế độ xem?
- 11. Tại sao sử dụng singleton thay vì phương pháp tĩnh?
- 12. Tại sao sử dụng char [] thay vì String?
- 13. tại sao fopen() hoặc mở() sử dụng errno thay vì chỉ trả lại mã lỗi?
- 14. Tại sao sử dụng var thay vì tên lớp?
- 15. Tại sao sử dụng Enums thay vì Constants?
- 16. Tại sao lặp lại nên được sử dụng thay vì đệ quy đuôi?
- 17. Làm sao để Jersey sử dụng SLF4J thay vì JUL?
- 18. Tại sao lại sử dụng khung mocking thay vì xoay vòng tay của chúng tôi?
- 19. Tại sao lại sử dụng giá trị hex thay vì 10 số cơ sở bình thường?
- 20. Tại sao lại sử dụng tên 'op_Addition' cho toán tử '+' thay vì tên '+'?
- 21. Tại sao lại sử dụng Redis thay vì MongoDb cho Caching?
- 22. Sử dụng giữ lại trong initWithCoder?
- 23. Tại sao nên sử dụng Function.prototype.bind thay vì Function.prototype.call?
- 24. Tại sao sử dụng registerDefaults: thay vì setValue: forKey :?
- 25. tại sao nó sử dụng movl thay vì đẩy?
- 26. Tại sao RTP sử dụng UDP thay vì TCP?
- 27. Tại sao sử dụng singleton thay vì lớp tĩnh?
- 28. Tại sao sử dụng tai thay vì chiến tranh?
- 29. Tại sao sử dụng ROLAP thay vì MySQL đơn giản?
- 30. Tại sao nên sử dụng GWT.create() thay vì mới?
Đề xuất là sử dụng bản sao cho các lớp học là một phần của cụm lớp có cặp có thể thay đổi/không thay đổi được; chẳng hạn như 'NSString' /' NSMutableString' 'NSArray' /' NSMutableArray' 'NSDictionary' /' NSMutableDictionary' 'NSSet' /' NSMutableSet', xem câu trả lời của @ Abizern [HERE] (http://stackoverflow.com/questions/4995254/nsmutablestring-as-retain-copy). – Kjuly