Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 可可中的Alloc和init_Macos_Cocoa_Init_Alloc - Fatal编程技术网

Macos 可可中的Alloc和init

Macos 可可中的Alloc和init,macos,cocoa,init,alloc,Macos,Cocoa,Init,Alloc,也许这是个愚蠢的问题,但我真的很想弄明白这个问题 例如,我有以下设置: // .h @interface MyClass : NSObject { NSView *myView; } // .m @implementation MyClass -(void)someMethod { // WHAT IS THE DIFFERENCE BETWEEN THIS myView = [[NSView alloc] init]; // AND THIS ? my

也许这是个愚蠢的问题,但我真的很想弄明白这个问题

例如,我有以下设置:

// .h
@interface MyClass : NSObject
{
   NSView *myView;
}

// .m

@implementation MyClass

-(void)someMethod
{

   // WHAT IS THE DIFFERENCE BETWEEN THIS
   myView = [[NSView alloc] init];

   // AND THIS ?

   myView = [myView init]; // assuming that myView was allocated somewhere earlier in init method
}

此语句
myView=[[NSView alloc]init]
只是对以下对象的嵌套方法调用

NSView *myView =[NSView alloc]; //line 1
myView=[myView init];//line 2
如果你在一行或多行中做,它不会做任何特定的事情

第1行:这里为对象分配了一个新的内存位置


第2行:向对象发送一个
init
,以初始化对象。

此语句
myView=[[NSView alloc]init]
只是对以下对象的嵌套方法调用

NSView *myView =[NSView alloc]; //line 1
myView=[myView init];//line 2
如果你在一行或多行中做,它不会做任何特定的事情

第1行:这里为对象分配了一个新的内存位置


第2行:向对象发送一个
init
,以初始化对象。

init
方法倾向于假设只向每个对象发送一次
init

再次将
init
发送到先前分配和初始化的
myView
将打破这一假设,导致内存泄漏,并可能导致随后的奇怪行为。这两个结果都来自于您发送给
myView
的第二条
init
消息,该消息创建对象、添加观察者等,这些对象以前已经设置过

这就是
someMethod
中的第二行所做的

第一行创建了一个新视图,这是
alloc
/
init
一二冲孔的影响。此视图与您使用(如果有)输入的
someMethod
视图是不同的对象,因此将
init
发送到该对象作为其创建的一部分不是问题

记住:对象不是变量
myView
是变量的名称;当我们说“
myView
”时,我们真正的意思是“
myView
持有的对象”


(最好从顶部重新阅读此答案,并牢牢记住最后一段中的概念。)

init
方法倾向于假设只向每个对象发送一次
init

再次将
init
发送到先前分配和初始化的
myView
将打破这一假设,导致内存泄漏,并可能导致随后的奇怪行为。这两个结果都来自于您发送给
myView
的第二条
init
消息,该消息创建对象、添加观察者等,这些对象以前已经设置过

这就是
someMethod
中的第二行所做的

第一行创建了一个新视图,这是
alloc
/
init
一二冲孔的影响。此视图与您使用(如果有)输入的
someMethod
视图是不同的对象,因此将
init
发送到该对象作为其创建的一部分不是问题

记住:对象不是变量
myView
是变量的名称;当我们说“
myView
”时,我们真正的意思是“
myView
持有的对象”


(最好从顶部重新阅读此答案,并牢牢记住最后一段中的概念。)

Objective-C与许多其他面向对象语言不同,它使对象创建成为一个明确的两阶段过程,即分配和初始化

<>如果你熟悉诸如java、C++和C++语言,那么对象创建的分配部分与初始化不可分割。例如,在Java中,您可以编写:

class Tree {

// constructor/initialiser
public Tree ()
{
   // whatever is needed to initialise a Tree
}

}

...
Tree myTree = new Tree(); // allocate and initalise a tree
Java的
new
表达式为
树分配内存,然后调用构造函数来正确设置内存

上述语言认识到,分配和初始化只是一个操作的两部分:对象创建

在目标C中,上述示例为:

@implementation Tree

// constructor/initialiser
(id) init ()
{
   // whatever is needed to initialise a Tree
}

@end

...
Tree *myTree = [[Tree alloc] init]; // allocate and initalise a tree
在这里,理论上您可以将分配和初始化分开,但不建议这样做。原因是
[Tree alloc]
通常不会返回完全格式的
,它会分配一些内存并将其标记为
,但
拥有的任何实例变量或
的超类都不会初始化-要进行初始化,必须调用
init
。如果将这两个操作分开,则可能存在不完整的对象,这些对象的行为将不符合预期。因此,尽管您可以将它们分开,但这样做是非常不明智的,以至于苹果的
init
文档中指出:

init
消息与
alloc
消息耦合在同一行代码中

这就是苹果为了防止你犯大错而说的一个小谎言

Objective-C也提供了单一的创建操作形式:

Tree *myTree = [Tree new]; // alloc + init
但是,与Java等人不同的是,如果您编写了一个采用参数的初始值设定项,您不会自动获得一个采用参数的
new
版本,您需要自己编写(作为类方法使用
alloc
和采用参数的初始值设定项)


HTH

Objective-C不同于其他许多面向对象语言,它使对象创建成为一个明确的两阶段过程,即分配和初始化

<>如果你熟悉诸如java、C++和C++语言,那么对象创建的分配部分与初始化不可分割。例如,在Java中,您可以编写:

class Tree {

// constructor/initialiser
public Tree ()
{
   // whatever is needed to initialise a Tree
}

}

...
Tree myTree = new Tree(); // allocate and initalise a tree
Java的
new
表达式为
树分配内存,然后调用构造函数来正确设置内存

上述语言认识到,分配和初始化只是一个操作的两部分:对象创建

在目标C中,上述示例为:

@implementation Tree

// constructor/initialiser
(id) init ()
{
   // whatever is needed to initialise a Tree
}

@end

...
Tree *myTree = [[Tree alloc] init]; // allocate and initalise a tree
在这里,理论上您可以将分配和初始化分开,但不建议这样做。原因