2013-07-14 2 views
1

Общеизвестно, что мы должны использовать атрибут (assign) в примитивных свойствах Objective-C, но у меня никогда не было четкого объяснения, почему мы это делаем.Почему мы всегда назначаем примитивы Objective-C?

считают

[myObject setIntProperty:22]; 

для класса myObject, который имеет @property (nonatomic, assign) int intProperty;

Мое воображение говорит, что мы бы назначая intProperty указатель на стек памяти, который содержит значение 22. Таким образом, поскольку этот указатель должен жить для того, чтобы наше свойство имело какую-либо ценность, означает ли это, что каждый примитив имеет неограниченное время жизни в стеке?

немного кода, чтобы показать, что я не понимаю:

myobject.h ----

@interface MyObject : NSObject 
@property (nonatomic, assign) int myInt; 
@property (nonatomic, assign) NSString* myString; 
@end 

OtherFile.m ----

-(void) doSomething 
{ 
    int x = 22; 
    NSString* str = @"something"; 

    MyObject* obj = [[MyObject alloc] init]; 

    obj.myInt = x; 
    obj.myString = str; 

    [self doSomethingInOtherFunctionWith:obj]; 
} 

Теперь раз функция doSomething завершена и перемещена, назначенная строка myString теперь ничего не указывает, поскольку она разделяет указатель с локальным str, функции, который уничтожается после функция запускается. Но myInt остается равным 22.

Я понимаю, что так оно и работает, передается по значению, и я не спрашиваю, КАК это работает, просто ПОЧЕМУ. Разве int не должен быть указателем на каком-то уровне?

+0

Объекты находятся на куче, поэтому их ивары находятся на куче. Причиной использования присваивания является то, что они не являются объектами, поэтому нет смысла сохранять или копировать их. –

ответ

1

Почему мы всегда назначаем примитивы Objective-C?

Потому что мы не можем retain или copy их - это для Objective-C только объекты.

Мое воображение говорит, что мы бы назначая intProperty указатель на память стека

Нет, не совсем. Мы присваиваем ему int. Конечно, внутренне переменная экземпляра реализуется как указатель-на-int в объект myObject с добавлением некоторого смещения (описываемого макетом переменных экземпляра класса).

Но если «переменная стека» означает «объекты [это терминология C для переменных] с автоматической продолжительностью хранения», то нет. Объекты Objective-C обычно распределяются динамически (возможно, «на кучу», но это действительно не имеет значения) и живут до тех пор, пока они не освобождаются, т.е. е. пока их количество ссылок не достигнет нуля. Затем они освобождаются, уничтожаются, и все их переменные экземпляра (которые возвращают соответствующие @property es) также недействительны.

+0

Ты все еще здесь! :) Что меня отталкивает, так это то, что если внутри функции я присваиваю объект свойству другого класса, это свойство ничего не укажет, если я его не сохранил (поскольку этот объект был локально привязан к функции) ,Тем не менее, примитивы, похоже, уклоняются от этой проблемы, потому что, если я создаю int внутри функции и присваиваю ее свойству, она живет, хотя это локальная переменная и никогда не сохранялась. – user

+0

@user Пожалуйста, продемонстрируйте свои вопросы с помощью некоторого кода. То, что вы написали, к сожалению, для меня не имеет смысла. –

+0

Теперь объясните нижний план, для которого я абсолютно не вижу ** никакого оправдания. ** –