Mọi người đều nói bạn không thể thay đổi/sửa đổi đối tượng bất biến. Tôi có một cách giải thích khác. Bạn có thể sửa đổi nó, nhưng sau đó bạn sẽ tạo một con trỏ mới mới đến đối tượng mới, nó không giống như bạn đã sửa đổi đối tượng cũ, một thương hiệu của nó. Mới. Vật. Bất kỳ con trỏ nào có con trỏ trỏ trước đó, sẽ không thấy thay đổi của nó. Tuy nhiên nếu nó là một đối tượng Mutable, bất kỳ đối tượng trỏ trước đó nào đối tượng sẽ thấy giá trị mới của nó. Xem các ví dụ. FYI %p
in vị trí con trỏ trong heap.
NSString * A = @"Bob";
NSString * B = @"Bob";
NSString * C = @"Bob1";
NSString * D = A;
NSLog(@"\n %p for A \n %p for B \n %p for C \n %p for D",A,B,C,D);
// memory location of A,B,D are same.
0x104129068 cho A
0x104129068 cho B
0x104129088 cho C
0x104129068 cho D
Sửa đổi đối tượng con trỏ của một
A = @"Bob2"; // this would create a new memory location for A, its previous memory location is still retained by B
NSLog(@"\n%p for A \n%p for B \n%p for C \n %p for D",A,B,C, D);
// A has a **new** memory location, B,D have same memory location.
0x1041290c8 cho A
0x104129068 cho B
0x104129088 cho C
0x104129068 cho D
// NSMutableString * AA = @"Bob"; <-- you CAN'T do this you will get error: Incompatible pointer types initializing NSMutableString with an Expression of type NSString
NSMutableString * AA = [NSMutableString stringWithString:@"Bob1"];
NSString * BB = @"Bob";
NSString * CC = @"Bob1";
NSString * DD = AA;
NSLog(@"\n %p for AA \n %p for BB \n %p for CC \n %p for DD",AA,BB,CC,DD);
// memory location of AA,DD are same.
0x7ff26af14490 cho AA
0x104129068 cho BB
0x104129088 cho CC
0x7ff26af14490 cho DD
Sửa đổi con trỏ AA của đối tượng
AA = (NSMutableString*)@"Bob3"; // This would NOT create a new memory location for A since its Mutable-- D was and still pointing to some location
NSLog(@"\n%p for AA \n%p for BB \n%p for CC \n %p for D",AA,BB,CC,DD);
// memory location of AA,DD are NOT same.
0x104129128 cho AA
0x104129068 cho BB
0x104129088 cho CC
0x7ff26af14490 cho DD
Như bạn có thể tưởng tượng, thuộc tính lưu trữ mặc định cho tất cả thuộc tính NSString là retain
. Để biết thêm thông tin về copy
& retain
Tôi khuyên bạn nên đọc câu hỏi này. NSString property: copy or retain?
Câu hỏi tiếp theo tốt sẽ là * tại sao * NSArray, NSString, NSSet, NSDictionary, v.v. * là * không thay đổi. –