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
和采用参数的初始值设定项)
HTHObjective-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
在这里,理论上您可以将分配和初始化分开,但不建议这样做。原因