Objective-C对象内存分配

时间:2017-10-26 04:16:33

标签: objective-c

在编写了多年的Objective-C代码后,(遗憾的是:-()我今天感到很困惑。还有太多东西需要学习。请看下面的代码片段:

NSString *string1 = @"A string";
char cString[] = "A string";
NSString *string2 = [[NSString alloc] initWithCString:cString encoding:NSUTF8StringEncoding];
NSString *string3 = [[NSString alloc] initWithBytes:cString length:sizeof(cString) encoding:NSUTF8StringEncoding];
NSLog(@"String Pointers:\nstring1: %p\nstring2: %p\nstring3: %p\n\n", string1, string2, string3);
NSLog(@"String Hashes:\nstring1: %lu\nstring2: %lu\nstring3: %lu\n\n", string1.hash, string2.hash, string3.hash);

NSNumber *number1 = @1;
NSNumber *number2 = [[NSNumber alloc] initWithInt:1];
NSNumber *number3 = [[NSNumber alloc] initWithInteger:1];
NSLog(@"Number Pointers:\nnumber1: %p\nnumber2: %p\nnumber3: %p\n\n", number1, number2, number3);
NSLog(@"Number Hashes:\nnumber1: %lu\nnumber2: %lu\nnumber3: %lu\n\n", number1.hash, number2.hash, number3.hash);

以下输出:

2017-10-25 23:55:24.572 ObjC[29888:303] String Pointers:
string1: 0x1000010a0
string2: 0x100109930
string3: 0x10010bcb0

2017-10-25 23:55:24.574 ObjC[29888:303] String Hashes:
string1: 10100169157824900864
string2: 10100169157824900864
string3: 8311704865341864449

2017-10-25 23:55:24.574 ObjC[29888:303] Number Pointers:
number1: 0x187
number2: 0x187
number3: 0x1c7

2017-10-25 23:55:24.575 ObjC[29888:303] Number Hashes:
number1: 2654435761
number2: 2654435761
number3: 2654435761

我有以下问题:

  1. string1是否已静态分配,其他对象(string2string3number1number2number3)是否已动态分配?
  2. 为什么number1number2具有相同的指针地址,如果它们都是动态分配但number3不相同? (它们都代表一个值为1的数字对象。)
  3. 为什么这三个字符串对象具有相同的(我猜?)字符串值,但只有前两个具有相同的哈希值?
  4. 调用-isEqual:方法时会发生什么?是指针比较还是哈希?或者取决于对象的类型? (仅限于Foundation对象。)
  5. 谢谢!

0 个答案:

没有答案