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

时间:2013-07-14 21:14:40

标签: objective-c pointers properties primitive

众所周知,我们应该在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是否必须是某个级别的指针?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

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

但是如果通过“堆栈变量”,你的意思是“对象[这是变量的C术语]具有自动存储持续时间”,那么没有。 Objective-C对象通常是动态分配的(可能是“在堆上”,但这确实是无关紧要的),并且只要它们没有被释放就可以生存,i。即直到他们的参考计数达到零。然后它们被解除分配,销毁,并且它们的所有实例变量(支持相应的@property es)也被无效。