众所周知,我们应该在 Objective-C 中的原始属性上使用属性 (assign)
,但我从未清楚地解释过为什么要这样做。
考虑
[myObject setIntProperty:22];
对于具有 @property(非原子,分配) int intProperty 的类
myObject
;
我的想象是,我们会为 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 在某种程度上不是必须是指针吗?
最佳答案
Why do we always assign Objective-C primitives?
因为我们无法保留
或复制
它们 - 这仅适用于 Objective-C 对象。
My imagination says we would be assigning intProperty a pointer to stack memory
不,不是真的。我们为其分配一个int
。当然,在内部,实例变量被实现为 myObject
对象中的 int 指针,并添加了一些偏移量(由类的实例变量布局描述)。
但是,如果“堆栈变量”的意思是“具有自动存储持续时间的对象[这是变量的 C 术语]”,那么就不行。 Objective-C 对象通常是动态分配的(可能是“在堆上”,但这实际上是无关紧要的),并且只要它们没有被释放就一直存在,即。 e.直到它们的引用计数达到零。然后它们被释放、销毁,并且它们的所有实例变量(支持相应的 @property
es)也都失效。
关于objective-c - 为什么我们总是分配 Objective-C 原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17643830/