iOS -copy&mutableCopy

1、对于非容器对象(NSString)

不可变 (NSString)

copy :浅复制,指针指向

mutableCopy:深复制,生成可变字符串对象

可变(NSMutableString)

copy: 深复制,生成不可变字符串对象

mutableCopy :深复制,生成可变字符串对象

2、对于容器类对象 数组

不可变(NSArray)

copy :浅复制,指针指向

mutableCopy:深复制,生成可变数组对象(但,数组中的对象没有进行处理的话,数组的中的对象是浅复制)

可变(NSMutableArray)

copy :深复制,生成不可变数组对象

mutableCopy:深复制,生成不可变数组对象

test:

    NSString *str1 = @"123";
    NSLog(@"%p",str1);
    NSString *str2 = [str1 copy];
    NSLog(@"%p",str2);
    NSMutableString *str3 = [str1 mutableCopy];
    NSLog(@"%p",str3);

    NSMutableString *str4 = [[NSMutableString alloc]initWithString:@"123"];
    NSLog(@"%p",str4);
    NSString *str5 = [str4 copy];
    NSLog(@"%p",str5);
    NSMutableString *str6 = [str4 mutableCopy];
    NSLog(@"%p",str6);

    NSArray *array1 = [[NSArray alloc] initWithObjects:@3,@4, nil];
    NSLog(@"%p",array1);
    NSArray *array2 = [array1 copy];
    NSLog(@"%p",array2);
    NSMutableArray *array3 = [array1 mutableCopy];
    NSLog(@"%p",array3);

    NSMutableArray *array4 = [[NSMutableArray alloc]initWithObjects:@2,@3, nil];
    NSLog(@"%p",array4);
    NSArray *array5 = [array4 copy];
    NSLog(@"%p",array5);
    NSMutableArray *array6 = [array4 mutableCopy];
    NSLog(@"%p",array6);
2016-08-23 10:54:50.878 [1364:147504] 0x10409cc90
2016-08-23 10:54:53.636 [1364:147504] 0x10409cc90
2016-08-23 10:54:53.636 [1364:147504] 0x7fd602d1c330

2016-08-23 10:54:54.322 [1364:147504] 0x7fd602dae190
2016-08-23 10:54:54.323 [1364:147504] 0xa000000003332313
2016-08-23 10:54:54.323 [1364:147504] 0x7fd602e07420

2016-08-23 10:54:55.924 [1364:147504] 0x7fd602d00d60
2016-08-23 10:54:56.750 [1364:147504] 0x7fd602d00d60
2016-08-23 10:54:56.750 [1364:147504] 0x7fd602c11050

2016-08-23 10:54:56.751 [1364:147504] 0x7fd602c2bfc0
2016-08-23 10:54:56.751 [1364:147504] 0x7fd602c0a070
2016-08-23 10:54:56.751 [1364:147504] 0x7fd602c0a220

3、NSHashTable -NSMapTable

NSHashTable 和 -NSMapTable是iOS 6 后出现的容器类对象,他有一个特点就是,对加入其中的对象,可以设置其为弱引用,

而不是像数组等容器加入对象后默认对象引用计数会加1,强引用,有点类似(weak,assgin)的容器

- (instancetype)initWithOptions:(NSPointerFunctionsOptions)options capacity:(NSUInteger)initialCapacity NS_DESIGNATED_INITIALIZER;

typedef NS_OPTIONS(NSUInteger, NSPointerFunctionsOptions) {
    // Memory options are mutually exclusive

    // default is strong
    NSPointerFunctionsStrongMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 0),       // use strong write-barrier to backing store; use GC memory on copyIn
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || TARGET_OS_WIN32
    NSPointerFunctionsZeroingWeakMemory NS_ENUM_DEPRECATED_MAC(10_5, 10_8) = (1UL << 0),  // deprecated; uses GC weak read and write barriers, and dangling pointer behavior otherwise
#endif
    NSPointerFunctionsOpaqueMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (2UL << 0),
    NSPointerFunctionsMallocMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (3UL << 0),       // free() will be called on removal, calloc on copyIn
    NSPointerFunctionsMachVirtualMemory NS_ENUM_AVAILABLE(10_5, 6_0) = (4UL << 0),
    NSPointerFunctionsWeakMemory NS_ENUM_AVAILABLE(10_8, 6_0) = (5UL << 0),         // uses weak read and write barriers appropriate for ARC or GC

    // Personalities are mutually exclusive
    // default is object.  As a special case, ‘strong‘ memory used for Objects will do retain/release under non-GC
    NSPointerFunctionsObjectPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (0UL << 8),         // use -hash and -isEqual, object description
    NSPointerFunctionsOpaquePersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (1UL << 8),         // use shifted pointer hash and direct equality
    NSPointerFunctionsObjectPointerPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (2UL << 8),  // use shifted pointer hash and direct equality, object description
    NSPointerFunctionsCStringPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (3UL << 8),        // use a string hash and strcmp, description assumes UTF-8 contents; recommended for UTF-8 (or ASCII, which is a subset) only cstrings
    NSPointerFunctionsStructPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (4UL << 8),         // use a memory hash and memcmp (using size function you must set)
    NSPointerFunctionsIntegerPersonality NS_ENUM_AVAILABLE(10_5, 6_0) = (5UL << 8),        // use unshifted value as hash & equality

    NSPointerFunctionsCopyIn NS_ENUM_AVAILABLE(10_5, 6_0) = (1UL << 16),      // the memory acquire function will be asked to allocate and copy items on input
};

4、iOS 中的Keychain API

ios 中的keychian 应该是一个系统级的单例,在里面存的信息,安全的程度比较高,

不同的app可以通过相同的key,度取相关的信息,简单实现不同app之间的信息共享一种思路

时间: 2024-10-06 22:50:38

iOS -copy&mutableCopy的相关文章

IOS — Copy

Copy 主要内容: copy的基本使用 自定义对象的copy属性 支持copy的自定义对象 1. copy的基本使用 ♠ copy的效果: 对源对象进行copy,建立出新的副本,彼此修改互不干扰! ♠ OC中有两种copy方式 1> copy 如果对象有可变/不可变之分,copy只能copy出不可变版本,如果没有此区分,copy方法就是建立一个副本. 2> mutableCopy 建立对象的可变副本(仅仅是当对象有可变和不可变版本时才需要是要本方法) @implementation View

ios copy 和 retain 字符串

1 @property (retain, nonatomic) NSString *retainStr; 2 @property (copy, nonatomic) NSString *copyStr; 3 4 5 6 @property (retain, nonatomic) NSMutableString *retainMStr; 7 @property (copy, nonatomic) NSMutableString *copyMStr; 8 9 10 11 实现代码如下: 12 13

objective-c copy mutableCopy 拷贝对象

原来不是所有的对象都支持 copy 只有遵守NSCopying 协议的类才可以发送copy消息 只有遵守NSMutableCopying 协议的类才可以发送mutableCopy消息 假如发送了一个没有遵守上诉两协议而发送 copy或者 mutableCopy,那么就会发生异常 默认 nsobject没有遵守这两个协议 但是 copy和mutableCopy这两个方法是nsobject定义的 如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法

iOS copy 和 mutableCopy 学习

(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢” 或者说”为什么 NSString 类型成员变量的修饰属性用 copy 而不是 strong (或 retain ) ?” 明显 第一句比第二句 严谨多了. @property (strong,nonatomic) NSString *strongString; & @property

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

readwrite:是可读可写特性,需要生成getter和setter方法:readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用:alloc 对象分配后引用计数为1retain 对象的引用计数+1 copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变assign:是赋值特性,setter方法将传入参数赋值给实例变量(一把钥匙,同进同出):用于基础数据类型:weak:由ARC引入的对象变量的属性,比assign多了一个

NSString NSMutableString copy mutableCopy retain weak strong

NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"Shaw"; NSString *str1 = @"Root"; // NSString *str1的意思是str1

copy&amp;mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)

本文来自 这里,原文作者微博MicroCai 概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCop

Copy &amp; MutableCopy

使用copy或mutableCopy方法可以创建一个对象的副本 copy 需要实现NSCoppying协议 创建的是不可变副本(如NSString.NSArray.NSDictionary) mutableCopy 需要先实现NSMutableCopying协议 创建的是可变副本(如NSMutableString.NSMutableArray.NSMutableDictionary) Copy的目的是建立副本,同时修改原始对象和复本不会互相干扰 深复制 & 潜复制 深复制: 内容拷贝,源对象和副

iOS copy/retain/assign

1 深复制:内容拷贝,源对象和副本对象指的是两个不同的对象,源对象引用计数器不变,副本对象引用计数器为1 2 浅复制:指针拷贝,源对象和副本对象指的都是同一个对象,对象引用计数器+1,相当于retain 3 只有不可变对象创建不可变副本(copy)才是浅复制,其它的都是深复制 copy关键字的使用 平时我们使用对象之间的传值都是采用retain count +1的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址, 但如果需求是,