objective-c - 为什么我们总是分配 Objective-C 原语?

标签 objective-c pointers properties primitive

众所周知,我们应该在 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.直到它们的引用计数达到零。然后它们被释放、销毁,并且它们的所有实例变量(支持相应的 @propertyes)也都失效。

关于objective-c - 为什么我们总是分配 Objective-C 原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17643830/

相关文章:

函数中的 C++ 指针

c# - 将 StringBuilder 传递给需要 char 指针的 DLL 函数

c - 如何将值分配给指针?

objective-c - Swift 只读外部,读写内部属性

iOS - NSFIleManager - 如何处理磁盘空间不足

javascript - 枚举中的点与括号表示法

javascript - 替换内置属性的 IE8 属性枚举(例如 `toString` )

c# - 根据其名称的字符串调用属性

ios - 纹理图集可以包含 PDF 图像吗?

iphone - 使用带有 CMMotionManager 的串行队列