Общеизвестно, что мы должны использовать атрибут (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 не должен быть указателем на каком-то уровне?
Объекты находятся на куче, поэтому их ивары находятся на куче. Причиной использования присваивания является то, что они не являются объектами, поэтому нет смысла сохранять или копировать их. –