这个记忆是如何处理的?

时间:2015-10-23 22:46:27

标签: objective-c memory memory-management

我对内存的管理方式有一个非常简单的问题。

aObject * object = [[aObject alloc] init];
NSArray * array = [[NSArray alloc] initWithObjects:object, nil];

当数组添加到数组时,数组是仅将内存的位置保持为Object还是将内存再次分配为object的大小?

此外,如果我已经分配了object但是我要在另一个文件中保存对object的引用,那么引用是否会分配自己的内存,或者只是将位置保存到原始记忆?例如:

@implementation aFile {
    aObject * object;
}
-(void)blah{
    object = [Aobject alloc] init];
}
@end


@implementation anotherFile {
    aObject * objectRef;
}
-(void)setObjectRef:(aObject*)object{
    objectRef = object;
}
@end

如果我要拨打setObjectRef:并传入object中创建的aFile,则会再次为objectRef分配内存,或者它只是对原始内存的引用是object

2 个答案:

答案 0 :(得分:1)

在Objective-C中,对象仅由非常具体的方法分配,通常只有copynewalloc,几乎所有其他方法都使用对象的引用。

NSArray只存储指向对象的指针,不会复制值。

aObject* object;声明一个指向对象的指针。指针时,指针不会复制它们指向的对象。相反,分配它们会更改它们指向的地址。

setObjectRef方法中,指针只是被分配,因此没有任何内容被复制。

答案 1 :(得分:1)

当您使用对象创建NSArray时,它实际上是指针数组指针。这意味着当您传递对象时,对象 不再 再次分配,实际上将引用保留在宾语。这意味着,如果您将可变对象传递给数组(如NSMutableString等),那么您将某些内容添加到字符串中,该数组将更改其值。另一方面,如果您使用不同的值再次初始化对象,则该对象的内存地址会发生更改,但是数组会保留对旧对象的引用 - 这意味着有2个不同的对象。最好在示例中看到它:

示例1:

NSString *testString = @"Test";
NSArray *testArray = @[testString];

testString = @"Test2";

这里我们创建不可变对象并将其传递给数组。让我们说testString有地址0x1,testArray 0x99。当我们将文字传递给testString时,它只不过是alloc然后用该字符串初始化。这意味着将重新分配内存,然后地址将不同,例如0X2。该数组仍然具有0x1的引用。 2个不同的对象

示例2:

NSMutableString *testString = [NSMutableString stringWithString:@"Test"];
NSArray *testArray = @[testString];

[testString appendString:@"2"];

这里我们创建了可变对象。让我们说它有地址0x1,数组地址0x2。当我们附加字符串时,地址不会更改。为什么?因为在创建可变字符串编译器时,您会更改它的大小,因此它会分配比您在特定时刻所需的更多。附加内容不会改变它的地址。当我们更改testString时,我们还会更改数组中字符串的值。 1个对象,而不是2个不同的

示例3:

NSMutableString *testString = [NSMutableString stringWithString:@"Test"];
NSArray *testArray = @[testString];

testString = [NSMutableString stringWithString:@"Test2"];

这里我们将可变对象传递给数组。再说一遍,它是0x1,数组0x2。这有什么不同?我们实际上并没有改变字符串,我们通过传递文字重新分配内存,即使它是可变字符串。这意味着当传递文字时,内存地址已更改为0x3,但数组仍然保持0x1。