为什么Objective C中的某些属性和变量用指针初始化而其他属性不是?

时间:2014-05-05 05:36:45

标签: objective-c allocation

来自Java等人,我不清楚这两个声明之间的区别:

@property (nonatomic, readwrite) NSInteger score;
@property (nonatomic, strong) NSMutableArray *cards;

为什么指针*不是两个属性声明的要求?

我在局部变量中也看到了很多:

- (void)viewDidLoad
{
    [super viewDidLoad];

    int foo = 1;
    NSString *bar = @"foo";
}

基本类型int和NS类型的静态分配有什么区别?

3 个答案:

答案 0 :(得分:4)

Objective-C对象总是在堆上分配,因此您始终可以通过指针访问它们。原始(或结构)类型的变量可以并且通常在堆栈上分配,并且在没有指针的情况下访问。

如果您熟悉Java,它基本上是相同的语义。原始类型通过值访问和传递,对象通过引用传递。不同之处在于ObjC(凭借其C谱系)语法明确标记了这种差异。

Apple框架中以大写前缀开头的类型名称并非都是ObjC类。 NSInteger是一种原始类型,就像int一样,所以你可以并且通常在没有指针的情况下使用它。

答案 1 :(得分:2)

指针始终用于引用堆中的某些内容,但在引用堆栈中的某些内容时则不会。但是 对于一些原始类型和简单的结构,可以通过堆栈访问,因此您不需要使用指针..

NSInteger 是一种基本类型,这意味着它将本地存储在堆栈中。没有必要使用指针来访问它,但如果你想使用指针,那么你可以。

如果你真的想用以下方式,你可以有一个指向 NSInteger 的指针:

NSInteger * pointerToProcessID =& yourNsintegervar;

答案 2 :(得分:1)

如果你看一下NSInteger的定义,你会发现它是一个简单整数的typedef。基本上,所有非对象类型都存储为简单值,而复杂对象的类型通常是指针属性。将这些更复杂的对象存储为指针有几个原因:

  1. 使用值本身而不是指针需要复制(也就是说,如果你使用指针,你可以将对象放在其他地方,你只需要复制更短的地址而不是全部恰好在该对象中的内容,因此它的效率更高。)

  2. 使用非指针类型时,必须知道所需的存储空间,如果您知道对象的确切类型,则会有效,但在继承的情况下会失败(例如,NSMutableArray可能会添加额外的例如,对于NSArray的字段。如果您使用NSArray而不是NSArray*,那么从NSMutableArray分配将被破坏,因为系统只留出足够的空间用于但是,当使用指针时,由于指针大小对于基类和派生类型都是相同的,因此可以将派生类型的指针指定给指向基类型的指针。 ,并且仍然可以正常工作)。

  3. 请注意,使用具有这些基本类型的指针类型也是可行且安全的;但是,这不是出于效率原因而做的(它会在没有必要的情况下创建额外的分配和解除引用)。