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

Objective-C中变量和对象之间的差异,objective-c,Objective C,我有点搞砸了以下常用代码:- NSArray *arrayData = [[NSArray alloc] init]; 问题是有人告诉我们,arrayData是一个对象,因为它来自NSArray集合类,但有时会分配一些内存并声明为指针变量 请澄清它是变量还是对象 当您声明NSArray*arrayData=[[NSArray alloc]init]时实际发生了什么, 它是在堆内存中创建数组类型的对象。它是在堆栈内存中创建的引用。在您的例子中,arrayData是存储在堆栈内存中的引用,它将数组

我有点搞砸了以下常用代码:-

NSArray *arrayData = [[NSArray alloc] init];
问题是有人告诉我们,
arrayData
是一个对象,因为它来自
NSArray集合类
,但有时会分配一些内存并声明为指针变量


请澄清它是变量还是对象

当您声明
NSArray*arrayData=[[NSArray alloc]init]时实际发生了什么,

它是在
内存中创建数组类型的对象。它是在
堆栈
内存中创建的引用。在您的例子中,
arrayData
是存储在堆栈内存中的引用,它将数组对象指向
heap
内存

对象是实例本身,而对象变量是对对象的引用。这里有一个人为的例子:
objecto=newobject()
对象ref1=o
在他的例子中,对象只有一个实例,但它被两个对象变量引用:
o和ref1


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

当您声明
NSArray*arrayData=[[NSArray alloc]init]时,实际会发生什么,

它是在
内存中创建数组类型的对象。它是在
堆栈
内存中创建的引用。在您的例子中,
arrayData
是存储在堆栈内存中的引用,它将数组对象指向
heap
内存

对象是实例本身,而对象变量是对对象的引用。这里有一个人为的例子:
objecto=newobject()
对象ref1=o
在他的例子中,对象只有一个实例,但它被两个对象变量引用:
o和ref1


这是面向对象编程的一般场景,并且
Objective C
明确遵循它。

在编程中,变量是一个给定给内存位置的名称,该内存位置包含一个值,但在程序的整个生命周期中,确切的值可能会发生变化。(如果由于语言限制,该值不能更改,则称为常量。如果该值可以更改,但不能更改,则仍为变量。)


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

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


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

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对象,…

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对象等等。在这里:

  • NSArray*
    -类型(从左一个开始)
  • arrayData
    -变量名
  • [[NSArray alloc]init]
    -类NSArray,类方法的调用

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

NSArray
是一个类。在这里:

  • NSArray*
    -类型(从左一个开始)
  • arrayData
    -变量名
  • [[NSArray alloc]init]
    -类NSArray,类方法的调用

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

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

在交谈中,你可以把它称为“对象”,但知道它是什么很重要

它是一个变量吗

将代码中的
arrayData
指针视为一个具有作用域且可操作的变量可能也是安全的

您还可能在
-alloc
-init
方法上被绊倒

一般来说。。
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.