我跟随的Objective-C教程创建了一个名为Square
的类和一个Square
的新实例,将其分配给名为square
的变量,如此:
Square *square = [[Square alloc] init];
现在根据我的理解,这是正在发生的事情。
这是创建类Square
的一个实例并将其返回;然后初始化返回的实例,并将其设置为变量square
:
*square = [[Square alloc] init];
我无法弄清楚为什么第一个" Square
"需要在这个或它正在做什么。
答案 0 :(得分:3)
Square *square = [[Square alloc] init];
(1) (2) (3) (4) (5)
(1)是对象的类型,因此创建的实例属于Square
(2)是指向该实例的指针。
(3)+(4)是此实例的分配方法,意味着它为此实例分配内存。
(5)是一个初始化方法,你可以自己实现,例如,将square的宽度设置为1.0
答案 1 :(得分:1)
从初始化行开始:
Square *square = [[Square alloc] init];
第二个square
是变量的名称,这是您稍后在整个代码中引用它的方式。你可以随意调用它。例如(现在不是很明显两个Square
都是多余的):
Square *a = [[Square alloc] init];
第一个Square是类型的变量或类型的对象。编译器将能够通过显示错误和警告来帮助您,并且许多论文都基于对象类型。
你实际上可以这样声明:
void *square = (void *)[[Square alloc] init];
这意味着您使用通用指针类型声明您的变量,但编译器很可能会发出很多警告。
答案 2 :(得分:1)
请注意,*square = [[Square alloc] init];
错误,没有类型名称" Square"。 *
字符实际上与前一个类型(Square *
)相关联,而不是以下变量名称。
原始陈述可以写成:
Square *square;
square = [[Square alloc] init];
第一个声明是小写" square"作为Square *
类型的变量,其中*
表示指向前一类型实体的指针"。 (事实上,我更喜欢像Square* square = [[Square alloc] init];
一样写它,以明确*
与" Square"相关联,但那不是"惯例"。)
应该注意的是,这两个名字之间并没有真正的联系。#34; Square"和" square"。他们可能是"苹果"和"橘子"并且该计划的逻辑将保持不变。第一个是类的名称(按惯例,总是以大写字母开头),第二个是变量的名称(按照惯例,总是以小写字母开头)。