众所周知,我们应该在Objective-C中对原始属性使用属性(assign)
,但我从来没有清楚地解释为什么我们这样做。
考虑
[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
。当然,在内部,实例变量实现为myObject
对象的指向int的指针,并添加了一些偏移量(由类的实例变量布局描述)。
但是如果通过“堆栈变量”,你的意思是“对象[这是变量的C术语]具有自动存储持续时间”,那么没有。 Objective-C对象通常是动态分配的(可能是“在堆上”,但这确实是无关紧要的),并且只要它们没有被释放就可以生存,i。即直到他们的参考计数达到零。然后它们被解除分配,销毁,并且它们的所有实例变量(支持相应的@property
es)也被无效。