Objective-C中变量和对象之间的差异

时间:2016-06-09 12:38:48

标签: objective-c

我对以下常用代码感到困惑: -

NSArray *arrayData = [[NSArray alloc] init];

问题是有人告诉arrayData是一个对象,因为它是从NSArray Collection class派生的,但在某个时候它被分配了一些内存并被声明为指针变量。

请澄清它是变量还是对象?

7 个答案:

答案 0 :(得分:2)

arrayData是一个变量。它是一个引用(指针)变量,所以它引用了一些东西。

它指的是指针的目标,是一个对象。

在Objective-C中,所有对象都是堆分配的,这意味着它们仅在运行时在堆内存中创建。在这种情况下,您总是需要对它的引用,它通常是在堆栈内存中分配的变量。

试试这个:

NSMutableString *string = [NSMutableString new]; // A variable string referring a mutable string object;
NSMutableString *string2 = string; // Another variable string2 referring the same (identical) mutable string object.
[string appendString:@"Amin"]; // The object, string refers to is now "string"
NSLog( @"%@", string2 ); // The same (identical) object, referred by another variable is now "string", too.

为了使它更复杂,C - Objective-C的基础 - 调用"对象"生活在运行时的所有东西:变量,OOP对象,......

答案 1 :(得分:1)

在您的代码段中arrayData在技术上是一个指针。它是指向内存中地址的指针,其值包含NSArray类型的对象。

会话中你可能会把它称为“对象”,但知道的重要性。

  

是变量吗?

将代码中的arrayData指针视为具有范围且可以操作的变量也可能是安全的。

您可能也会被-alloc-init方法绊倒..

非常一般地说......

-alloc:在内存中为NSArray对象分配一个插槽。

-init:初始化NSArray对象并在内存中返回指向该对象的指针。

有关使用对象的更多信息: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html

和Obj-C初始化: https://www.binpress.com/tutorial/objectivec-lesson-11-object-initialization/76

答案 2 :(得分:1)

NSArray *arrayData = [[NSArray alloc] init];

本声明中有很多内容。第一次出现'NSArray'告诉编译器创建arrayData作为指向这种类型对象(NSArray)的指针,而第二次出现'NSArray'(带有alloc)则传递'alloc'消息(方法)到NSArray类(即调用alloc方法)。同一个词,两个完全不同的含义。

从概念上讲,首先发生的是[NSArray alloc],它在'NSArray'类中调用(class)方法'alloc'。这将返回NSArray对象的(空)实例。我们在新的空对象中调用'init'方法。然后,指向结果对象的指针存储在'arrayData'变量中,我们告诉编译器这是一个指向NSArray对象的指针。

这样想:

NSArray *arrayData;         Create a pointer to an NSArray object.
newArray = [NSArray alloc]; Create an empty NSArray object by calling the class method alloc in NSArray 
[newArray init];              Initialise it by calling the object's 'init' method
arrayData = *newArray;        Assign a pointer to it to my variable.

答案 3 :(得分:1)

  1. 它在堆内存中创建类型数组的对象。它是在堆栈内存中创建的引用。在你的情况下,arrayData是存储在堆栈内存中的引用,它将数组对象指向堆内存。

  2. arrayData是一个变量。它是一个引用(指针)变量,因此引用了一些东西。

  3. 它指的是指针的目标,是一个对象。

答案 4 :(得分:0)

宣布NSArray *arrayData = [[NSArray alloc] init];

时会发生什么

它在heap内存中创建了类型数组的对象。它是在stack内存中创建的引用。在你的情况下arrayData是存储在堆栈内存中的引用,它将数组对象指向heap内存。

  

Object是实例本身,而Object Variable是对Object的引用。这是一个人为的例子:Object o = new Object(); Object ref1 = o;在他的例子中,有一个Object的实例,但它由两个对象变量引用:o and ref1

这是面向对象编程的一般场景,Objective C肯定会遵循它。

答案 5 :(得分:0)

在编程中,变量是给予内存位置的名称,该内存位置保存一个值,但精确值可以在程序的生命周期内发生变化。 (如果值不能改变,由于语言限制,它被称为常量。如果 可以改变,但不是,它仍然是变量。)

对象不是变量,但它通常包含一些变量。指向对象的指针通常是一个变量,因为包含指向对象的指针的内存位置可能会随时间改变值。从程序员的角度来看,这是在程序的过程中使用相同的指针来引用不同的对象。

答案 6 :(得分:-1)

NSArray是一个班级。这里:

  • NSArray * - 输入(左起)
  • arrayData - 变量名称
  • [[NSArray alloc] init] - 类NSarray,类方法的调用

使用alloc / init创建任何对象时,其保留计数将增加1。这意味着它会占用一些记忆。因此,对于内存管理,您必须处理保留计数。