我对以下常用代码感到困惑: -
NSArray *arrayData = [[NSArray alloc] init];
问题是有人告诉arrayData
是一个对象,因为它是从NSArray Collection class
派生的,但在某个时候它被分配了一些内存并被声明为指针变量。
请澄清它是变量还是对象?
答案 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
对象并在内存中返回指向该对象的指针。
和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)
它在堆内存中创建类型数组的对象。它是在堆栈内存中创建的引用。在你的情况下,arrayData是存储在堆栈内存中的引用,它将数组对象指向堆内存。
arrayData是一个变量。它是一个引用(指针)变量,因此引用了一些东西。
它指的是指针的目标,是一个对象。
答案 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。这意味着它会占用一些记忆。因此,对于内存管理,您必须处理保留计数。