2015-10-23 3 views
0

У меня очень простые вопросы о том, как управляется память.Как обрабатывается эта память?

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

FYI Объект, определенный вами в setObjectRef, не такой, как вы заявили в aFile. –

ответ

1

При создании NSArray с объектами, это действительно указатель на массив указателей. Это означает, что когда вы проходите объект, объект не выделен снова, на самом деле он сохраняет ссылку. Это означает, что если вы передаете изменяемый объект в массив (например, NSMutableString и т. Д.), То вы добавите что-то в строку, массив изменит его значение. Если вы, с другой стороны, снова инициализируете объект, с другим значением, адрес памяти изменяется для этого объекта, но массив сохраняет ссылку на старый объект - это означает, что есть два разных объекта. Лучше, чтобы увидеть это на примерах:

Пример 1:

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

testString = @"Test2"; 

Здесь мы создаем неизменный объект и передать его в массив. Допустим, testString имеет адрес 0x1, testArray 0x99. Когда мы передаем литерал в testString, его не более чем выделяем, а затем инициализируем эту строку. Это значит, что перераспределит память, а затем адрес будет другим, например. 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.

1

В объектах Objective-C выделяются только определенные методы, обычно только copy, new и alloc, почти все остальное использует ссылки на объекты.

NSArray просто хранит указатели на объекты, значения не копируются.

aObject* object; объявляет указатель на объект. Указатели не копируют объект, на который они указывают, когда назначены. Вместо этого их назначение изменяет адрес, на который они указывают.

В вашем методе setObjectRef указатель просто присваивается, так что ничего не копируется.

+0

Маленький nitpick, это фактически только 'allocWithZone:', который выделяет память и вызывается 'alloc'. 'copy' и' copyWithZone: 'вызывать эти два метода для выделения памяти. – JustSid

+1

@JustSid Я имел в виду больше имени именования этого метода для удобства использования, а не там, где распределение фактически происходит. Если вы видите какой-либо вызов выделения или копирования, у вас есть все основания предполагать выделение памяти. –

Смежные вопросы