我对内存的管理方式有一个非常简单的问题。
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
?
答案 0 :(得分:1)
在Objective-C中,对象仅由非常具体的方法分配,通常只有copy
,new
和alloc
,几乎所有其他方法都使用对象的引用。
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。