2

众所周知,我们应该(assign)在 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

其他文件.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 不是必须是某个级别的指针吗?

4

1 回答 1

2

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

因为我们不能retaincopy他们 - 这仅适用于 Objective-C 对象。

我的想象是我们将分配 intProperty 一个指向堆栈内存的指针

不,不是。我们正在int为它分配一个。当然,在内部,实例变量被实现为指向myObject对象的指向 int 的指针,并添加了一些偏移量(由类的实例变量布局描述)。

但是,如果通过“堆栈变量”,您的意思是“具有自动存储持续时间的对象[这是变量的 C 术语]”,那么不是。Objective-C 对象通常是动态分配的(可能是“在堆上”,但这真的无关紧要),只要它们没有被释放,即直到它们的引用计数达到零,它们就会一直存在。然后它们被释放、销毁,并且它们的所有实例变量(支持相应的@propertyes)也被无效。

于 2013-07-14T21:19:07.270 回答