CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này nói sơ qua về một số giao thức phổ biến NSCopying/NSMutableCopying trong iOS được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
1. Một số giải thích.
Khi nói đến giao thức NSCopying và NSMutableCopying, điều tôi phải nói là sao chép và mutableCopy.
Nếu một lớp muốn hỗ trợ các hoạt động sao chép, nó phải triển khai giao thức NSCopying, nghĩa là triển khai phương thức copyWithZone.
Nếu một lớp muốn hỗ trợ các hoạt động mutableCopy, thì nó phải triển khai giao thức NSMutableCopying, nghĩa là triển khai phương thức mutableCopyWithZone,
Một số lớp trong hệ thống iOS đã triển khai các phương thức giao thức NSCopying hoặc NSMutableCopying. Nếu bạn gửi một bản sao hoặc thông báo mutableCopy đến một lớp hệ thống hoặc lớp tùy chỉnh không triển khai phương thức tương ứng thì nó sẽ gặp sự cố.
*** Đang chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'NSInvalidArgumentException', lý do: '-[Person copyWithZone:]: bộ chọn không được nhận dạng đã gửi đến phiên bản 0x6080000314c0' 。
Gửi tin nhắn sao chép và tin nhắn Sao chép có thể thay đổi đều là các thao tác sao chép, nhưng phương pháp sao chép hơi khác nhau đối với các lớp không chứa của đối tượng bất biến, lớp không chứa của đối tượng có thể thay đổi, lớp chứa của đối tượng có thể thay đổi và lớp chứa của đối tượng bất biến;Nhưng. hai điểm sau đây giống nhau:
Gửi một tin nhắn sao chép và đối tượng được sao chép là một đối tượng bất biến.
Gửi tin nhắn Sao chép có thể thay đổi và đối tượng được sao chép là đối tượng có thể thay đổi.
Vì vậy, các hoạt động sau đây sẽ gây ra sự cố.
?
1
2
3
|
NSMutableString *test1 = [[NSMutableString phân bổ]initWithString:@"11111"];
NSMutableString *test2 = [bản sao test1];
[test2 appendString:@"22222"];
|
*** Đang chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'NSInvalidArgumentException', lý do: '-[NSTaggedPointerString appendString:]: bộ chọn không được nhận dạng đã gửi đến 。
2. Lớp không chứa hệ thống.
Các lớp không chứa được hệ thống cung cấp, chẳng hạn như NSString và NSMutableString, có các đặc điểm sau:
Gửi bản sao tới một đối tượng bất biến là một bản sao con trỏ; gửi tin nhắn mutalbeCopy đến một đối tượng bất biến là một bản sao nội dung;
?
1
2
3
4
5
|
NSString *test3 = @"111111";
NSString *test4 = [bản sao test3];
NSMutableString *test5 = [test3 mutableCopy];
NSLog(@"test3 là %p, test4 là %p, tast5 là %p",test3,test4,test5);
test3 là 0x10d6bb3a8, test4 là 0x10d6bb3a8, tast5 là 0x600000073e80
|
Gửi tin nhắn copy và mutableCopy tới các đối tượng có thể thay đổi là bản sao sâu, có nghĩa là sao chép nội dung .
?
1
2
3
4
5
6
|
NSMutableString *test11 = [[NSMutableString phân bổ]initWithString:@"444444"];
NSString *test12 = [bản sao test11];
NSMutableString *test13 = [test11 mutableCopy];
NSLog(@"test11 là %p, test12 là %p, tast13 là %p",test11,test12,test13);
test11 là 0x600000073e00, test12 là 0xa003434343434346, tast13 là 0x600000073dc0
|
3. Lớp chứa hệ thống.
Các lớp vùng chứa do hệ thống cung cấp, chẳng hạn như NSArray và NSDictionary, có các đặc điểm sau:
Bản sao đối tượng bất biến là bản sao nông, nghĩa là sao chép con trỏ; gửi bản sao có thể thay đổi là bản sao sâu, nghĩa là sao chép nội dung.
?
1
2
3
4
5
|
NSArray *mảng = [mảngNSArrayVớiCácĐốiTượng:@"1", không có];
NSArray *copyArray = [sao chép mảng];
NSMutableArray *mutableCopyArray = [mảng mutableCopy];
NSLog(@"mảng là %p, copyArray là %p, mutableCopyArray là %p", mảng, copyArray, mutableCopyArray);
mảng là 0x60800001e580, copyArray là 0x60800001e580, mutableCopyArray là 0x608000046ea0
|
Cả bản sao đối tượng có thể thay đổi và bản sao có thể thay đổi đều là bản sao sâu một lớp, nghĩa là bản sao nội dung một lớp;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
NSMutableArray *element = [mảngNSMutableArrayVớiĐối tượng:@1];
NSMutableArray *mảng = [NSMutableArray mảngVớiĐối tượng:phần tử];
NSArray *copyArray = [sao chép mảng];
NSMutableArray *mutableCopyArray = [mảng mutableCopy];
NSLog(@"mảng là %p, copyArray là %p, mutableCopyArray là %p", mảng, copyArray, mutableCopyArray);
[mutableCopyArray[0] thêmĐối tượng:@2];
NSLog(@"phần tử là %@, mảng là %@, copyArray là %@, mutableCopyArray là %@", phần tử, mảng, copyArray, mutableCopyArray);
2017-02-22 11:53:25.286 test[91520:3915695] mảng là 0x600000057670, copyArray là 0x600000000bc0, mutableCopyArray là 0x6080000582a0
2017-02-22 11:53:25.287 phần tử test[91520:3915695] là (
1,
2
), mảng là (
(
1,
2
)
), copyArray là (
(
1,
2
)
), mutableCopyArray là (
(
1,
2
)
)
|
4. Các lớp học tùy chỉnh.
Lưu ý quan trọng:
1. Tất cả các thiết kế mã đều dựa trên nhu cầu kinh doanh.
2. Đối với các lớp tùy chỉnh, điều tương tự cũng đúng đối với việc xác định xem các thông báo sao chép và có thể thay đổi được có thể được gửi đến các đối tượng hay không;
1. Sửa đổi câu lệnh @property bằng bản sao.
Tôi phải nói về sự khác biệt giữa copy và strong khi copy. Vấn đề tính tham chiếu sẽ không được thảo luận ở đây.
copy: Sao chép một bản sao bất biến và gán nó cho thuộc tính để khi giá trị đối tượng ban đầu thay đổi thì giá trị thuộc tính sẽ không thay đổi;
mạnh: Nó có thể trỏ đến một đối tượng có thể thay đổi. Nếu đối tượng có thể thay đổi được sửa đổi bên ngoài, nó sẽ ảnh hưởng đến thuộc tính;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@interface Người: NSObject
@property (nonatomic, copy) NSString *familyname;
@property (không phải nguyên tử, mạnh) NSString *nickname;
@kết thúc
Người *p1 = [[Người phân bổ]init];
NSMutableString *familyname = [[NSMutableString alloc]initWithString:@"张三"];
p1.familyname = họ;
[họ appendString:@"峰"];
NSLog(@"p1.familyname là %@",p1.familyname);
NSMutableString *nickname = [[NSMutableString alloc]initWithString:@"Tên"];
p1.nickname = biệt danh;
[biệt hiệu chắp thêmString:@"蛋儿"];
NSLog(@"p1.nickname là %@", p1.nickname);
22-02-2017 13:53:58.979 test[98299:3978965] p1.familyname là Zhang San
22-02-2017 13:53:58.979 test[98299:3978965] p1.biệt danh là Ergoudaner
|
2. Bản sao của các đối tượng lớp.
Điều duy nhất cần được giải thích ở đây là chú ý đến sự kế thừa lớp.
Bài viết này hướng dẫn rất rõ ràng và chi tiết nên mình chỉ chép lại kết luận ở đây:
1 lớp kế thừa trực tiếp từ NSObject, không cần gọi [super copyWithZone:zone].
2 Lớp cha triển khai giao thức sao chép và lớp con cũng triển khai giao thức sao chép. Lớp con cần gọi [super copyWithZone:zone].
3 Lớp cha không triển khai giao thức sao chép, nhưng lớp con triển khai giao thức sao chép. Lớp con không cần gọi [super copyWithZone:zone].
4. Trong phương thức copyWithZone, gọi [[[self class] alloc] init] để cấp phát bộ nhớ.
5、NSCopying 。
NSCopying là một giao thức để sao chép đối tượng.
Nếu đối tượng của một lớp hỗ trợ sao chép thì lớp đó phải tuân thủ và triển khai giao thức NSCopying.
?
1
2
3
4
5
6
7
8
9
|
Chỉ có một phương thức trong giao thức NSCopying như sau:
- (id)copyWithZone:(NSZone *)zone {
Người *mô hình = [[[lớp tự] allocWithZone:zone] init];
model.firstName = self.firstName;
model.lastName = self.lastName;
//Thành viên không được tiết lộ
mô hình->_nickName = _nickName;
mô hình trả về;
}
|
3、Sao chép NSMutable。
Khi một lớp tùy chỉnh có thuộc tính là đối tượng có thể thay đổi, thao tác mutableCopyWithZone phải được thực hiện khi sao chép thuộc tính.
?
1
2
3
4
5
6
7
8
|
- (id)copyWithZone:(NSZone *)zone {
AFHTTPRequestSerializer *serializer = [[[lớp tự] allocWithZone:zone] init];
serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone];
serializer.queryStringSerializationStyle = self.queryStringSerializationStyle;
serializer.queryStringSerialization = self.queryStringSerialization;
trả về bộ tuần tự hóa;
}
|
Bài viết trên thảo luận ngắn gọn về một số giao thức phổ biến NSCopying/NSMutableCopying trong iOS. Đây là toàn bộ nội dung được editor chia sẻ, hy vọng có thể cho các bạn tham khảo và mong các bạn ủng hộ.
Liên kết gốc: http://blog.csdn.net/u011752619/article/details/78865190.
Cuối cùng, bài viết thảo luận ngắn gọn về một số giao thức phổ biến NSCopying/NSMutableCopying trong iOS kết thúc tại đây. Nếu bạn muốn biết thêm về cách thảo luận ngắn gọn về một số giao thức phổ biến NSCopying/NSMutableCopying trong iOS, vui lòng tìm kiếm bài viết CFSDN hoặc duyệt qua các bài viết liên quan. bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!