NSString对象是不可变字符串对象,但是NSString类型的指针可以指向NSMutableString类型的对象(NSMutableString类是NSString的子类),因此NSString *str指针指向的对象可能是变化的。测试代码如下:
StringObject类:
#import <Foundation/Foundation.h> @interface StringObject : NSObject @property (strong, nonatomic) NSString *strong_string; @property (weak, nonatomic) NSString *weak_string; @property (retain,nonatomic) NSString *retain_string; @property (copy, nonatomic) NSString *cpy_string; - (void)createStrings; @end
#import "StringObject.h"
@implementation StringObject
- (void)createStrings {
NSMutableString *mutable_string = [NSMutableString stringWithString:@"string"];
NSLog(@"mutable string");
NSLog(@"指向的对象的地址为:%p", mutable_string);
NSLog(@"指针的地址为: %p", &mutable_string);
NSLog(@"---------------------------");
self.strong_string = mutable_string;
NSLog(@"strong string");
NSLog(@"指向的对象的地址为:%p", _strong_string);
NSLog(@"指针的地址为: %p", &_strong_string);
NSLog(@"---------------------------");
self.weak_string = mutable_string;
NSLog(@"weak string");
NSLog(@"指向的对象的地址为:%p", _weak_string);
NSLog(@"指针的地址为: %p", &_weak_string);
NSLog(@"---------------------------");
self.retain_string = mutable_string;
NSLog(@"retain string");
NSLog(@"指向的对象的地址为:%p", _retain_string);
NSLog(@"指针的地址为: %p", &_retain_string);
NSLog(@"---------------------------");
self.cpy_string = mutable_string;
NSLog(@"copy string");
NSLog(@"指向的对象的地址为:%p", _cpy_string);
NSLog(@"指针的地址为: %p", &_cpy_string);
NSLog(@"---------------------------");
[mutable_string appendString:@" append"];
NSLog(@"mutable string = %@", mutable_string);
NSLog(@"strong string = %@", self.strong_string);
NSLog(@"weak string = %@", self.weak_string);
NSLog(@"retain string = %@", self.retain_string);
NSLog(@"copy string = %@", self.cpy_string);
}
@end
#import <Foundation/Foundation.h>
#import "StringObject.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
StringObject *so = [[StringObject alloc] init];
[so createStrings];
}
return 0;
}
2014-02-01 21:03:59.468 copy[2702:303] mutable string 2014-02-01 21:03:59.469 copy[2702:303] 指向的对象的地址为:0x1002044e0 2014-02-01 21:03:59.469 copy[2702:303] 指针的地址为: 0x7fff5fbff8b8 2014-02-01 21:03:59.470 copy[2702:303] --------------------------- 2014-02-01 21:03:59.470 copy[2702:303] strong string 2014-02-01 21:03:59.470 copy[2702:303] 指向的对象的地址为:0x1002044e0 2014-02-01 21:03:59.470 copy[2702:303] 指针的地址为: 0x100201e58 2014-02-01 21:03:59.470 copy[2702:303] --------------------------- 2014-02-01 21:03:59.471 copy[2702:303] weak string 2014-02-01 21:03:59.471 copy[2702:303] 指向的对象的地址为:0x1002044e0 2014-02-01 21:03:59.471 copy[2702:303] 指针的地址为: 0x100201e60 2014-02-01 21:03:59.471 copy[2702:303] --------------------------- 2014-02-01 21:03:59.472 copy[2702:303] retain string 2014-02-01 21:03:59.472 copy[2702:303] 指向的对象的地址为:0x1002044e0 2014-02-01 21:03:59.472 copy[2702:303] 指针的地址为: 0x100201e68 2014-02-01 21:03:59.472 copy[2702:303] --------------------------- 2014-02-01 21:03:59.473 copy[2702:303] copy string 2014-02-01 21:03:59.494 copy[2702:303] 指向的对象的地址为:0x7fff7e709ad0 2014-02-01 21:03:59.495 copy[2702:303] 指针的地址为: 0x100201e70 2014-02-01 21:03:59.495 copy[2702:303] --------------------------- 2014-02-01 21:03:59.495 copy[2702:303] mutable string = string append 2014-02-01 21:03:59.496 copy[2702:303] strong string = string append 2014-02-01 21:03:59.496 copy[2702:303] weak string = string append 2014-02-01 21:03:59.496 copy[2702:303] retain string = string append 2014-02-01 21:03:59.496 copy[2702:303] copy string = string
如果希望NSString属性跟随外部的影响动态变化,就用strong,weak或retain等特性,如果希望保护NSString的值不变,就用copy特性。
NSArray对象同理:
ArrayObject类:
#import <Foundation/Foundation.h> @interface ArrayObject : NSObject @property (strong, nonatomic) NSArray *strong_array; @property (weak, nonatomic) NSArray *weak_array; @property (retain, nonatomic) NSArray *retain_array; @property (copy, nonatomic) NSArray *cpy_array; - (void)createArrayObjects; @end
#import "ArrayObject.h"
@implementation ArrayObject
- (void)createArrayObjects {
NSMutableArray *mutable_array = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];
NSLog(@"mutable array");
NSLog(@"指向的对象的地址为:%p", mutable_array);
NSLog(@"指针的地址为: %p", &mutable_array);
NSLog(@"---------------------------");
self.strong_array = mutable_array;
NSLog(@"strong array");
NSLog(@"指向的对象的地址为:%p", _strong_array);
NSLog(@"指针的地址为: %p", &_strong_array);
NSLog(@"---------------------------");
self.weak_array = mutable_array;
NSLog(@"weak array");
NSLog(@"指向的对象的地址为:%p", _weak_array);
NSLog(@"指针的地址为: %p", &_weak_array);
NSLog(@"---------------------------");
self.retain_array = mutable_array;
NSLog(@"retain array");
NSLog(@"指向的对象的地址为:%p", _retain_array);
NSLog(@"指针的地址为: %p", &_retain_array);
NSLog(@"---------------------------");
self.cpy_array = mutable_array;
NSLog(@"copy array");
NSLog(@"指向的对象的地址为:%p", _cpy_array);
NSLog(@"指针的地址为: %p", &_cpy_array);
NSLog(@"---------------------------");
mutable_array[0] = @"new 1";
NSLog(@"mutable array = %@", mutable_array);
NSLog(@"strong array = %@", self.strong_array);
NSLog(@"weak array = %@", self.weak_array);
NSLog(@"retain array = %@", self.retain_array);
NSLog(@"copy array = %@", self.cpy_array);
}
@end
#import <Foundation/Foundation.h>
#import "StringObject.h"
#import "ArrayObject.h"
#define TEST 0
int main(int argc, const char * argv[])
{
@autoreleasepool {
#if TEST == 1
StringObject *so = [[StringObject alloc] init];
[so createStrings];
#else
ArrayObject *ao = [[ArrayObject alloc] init];
[ao createArrayObjects];
#endif
}
return 0;
}
2014-02-01 21:23:35.100 copy[2839:303] mutable array
2014-02-01 21:23:35.101 copy[2839:303] 指向的对象的地址为:0x10010b4e0
2014-02-01 21:23:35.101 copy[2839:303] 指针的地址为: 0x7fff5fbff8b8
2014-02-01 21:23:35.101 copy[2839:303] ---------------------------
2014-02-01 21:23:35.101 copy[2839:303] strong array
2014-02-01 21:23:35.102 copy[2839:303] 指向的对象的地址为:0x10010b4e0
2014-02-01 21:23:35.102 copy[2839:303] 指针的地址为: 0x1001097a8
2014-02-01 21:23:35.102 copy[2839:303] ---------------------------
2014-02-01 21:23:35.102 copy[2839:303] weak array
2014-02-01 21:23:35.103 copy[2839:303] 指向的对象的地址为:0x10010b4e0
2014-02-01 21:23:35.103 copy[2839:303] 指针的地址为: 0x1001097b0
2014-02-01 21:23:35.103 copy[2839:303] ---------------------------
2014-02-01 21:23:35.103 copy[2839:303] retain array
2014-02-01 21:23:35.104 copy[2839:303] 指向的对象的地址为:0x10010b4e0
2014-02-01 21:23:35.104 copy[2839:303] 指针的地址为: 0x1001097b8
2014-02-01 21:23:35.104 copy[2839:303] ---------------------------
2014-02-01 21:23:35.104 copy[2839:303] copy array
2014-02-01 21:23:35.104 copy[2839:303] 指向的对象的地址为:0x1002002a0
2014-02-01 21:23:35.105 copy[2839:303] 指针的地址为: 0x1001097c0
2014-02-01 21:23:35.105 copy[2839:303] ---------------------------
2014-02-01 21:23:35.105 copy[2839:303] mutable array = (
"new 1",
2,
3
)
2014-02-01 21:23:35.105 copy[2839:303] strong array = (
"new 1",
2,
3
)
2014-02-01 21:23:35.106 copy[2839:303] weak array = (
"new 1",
2,
3
)
2014-02-01 21:23:35.106 copy[2839:303] retain array = (
"new 1",
2,
3
)
2014-02-01 21:23:35.106 copy[2839:303] copy array = (
1,
2,
3
)
原文:http://blog.csdn.net/u010962810/article/details/18896023