Objective c 目标-C(aClassName*)

Objective c 目标-C(aClassName*),objective-c,Objective C,我是一个自创的程序员,所以我有时会缺少一些基础知识 这就是为什么我不能很好地定义我问题的主题,因为我不知道如何命名它以及它是如何工作的(但我知道答案对你们中的许多人来说似乎微不足道)。当你知道你在寻找什么时,找到答案就容易多了 在objective-c中,我可以看到如下代码行: aClassName *myObject = (aClassName *)[NSEntityDescription insertNewObjectForEntityForName:@"aClassName" inMana

我是一个自创的程序员,所以我有时会缺少一些基础知识

这就是为什么我不能很好地定义我问题的主题,因为我不知道如何命名它以及它是如何工作的(但我知道答案对你们中的许多人来说似乎微不足道)。当你知道你在寻找什么时,找到答案就容易多了

在objective-c中,我可以看到如下代码行:

aClassName *myObject = (aClassName *)[NSEntityDescription insertNewObjectForEntityForName:@"aClassName" inManagedObjectContext:app.managedObjectContext];
让我烦恼的是(aClass*)部分。这是什么

我知道/感觉它与非常基本的知识有关,但我无法命名,所以我找不到它

我猜(到目前为止我一直是这样使用它的)是用于调用类方法(+),但我不确定,它可能比我所理解的更深刻

感谢您的解释。

这是类型转换:

double x = 5.0;
int y = (int)x;
我不知道为什么会出现在您的例子中,据我所知,该方法返回
id
,因此不需要强制转换(即使没有它,也不会生成编译器警告)

关于“哪里找到这些信息”:Objul-C/C++是基于C和C++的,因此我建议先学习这些语言的基础知识。

< P>是类型转换:

double x = 5.0;
int y = (int)x;
我不知道为什么会出现在您的例子中,据我所知,该方法返回
id
,因此不需要强制转换(即使没有它,也不会生成编译器警告)


关于“哪里找到这些信息”:Objul-C/C++是基于C和C++的,因此我建议先学习这些语言的基础知识。

< P>这是一个演员,在这种情况下是一个下拉式(甚至因为上投是隐性的)。 强制转换是开发人员在编写代码时执行的一种操作,用于提示编译器某个类型比编译器正在考虑的类型窄

考虑以下情况:

Class *a = [[Subclass alloc] init];
Subclass *b = a;
(假设
子类
的子类)

这将不会编译,因为
a
是使用子类中不包含的类型静态定义的。但是赋值不会动态地产生任何问题,因为实际上
a
用于存储
子类
对象

那你是干什么的?您放置一个cast
子类*b=(子类*)a
告诉编译器“信任我并忽略类型检查该赋值,我断言它在运行时是有效的”,然后自动删除编译错误。强制这种行为当然会从代码中删除类型安全性,所以您必须知道自己在做什么

当然,要理解这种情况下强制转换的含义,您至少必须了解继承和对象


在您的特定情况下,
+(id)insertNewObjectForEntityForName:…
方法的返回类型是
id
,这是ObjectVec中最不特定的对象类型,如果不像普通的
id

那样存储,它总是需要被强制转换为某个对象,在这种情况下是向下转换(即使是因为向上投射是隐式的)

强制转换是开发人员在编写代码时执行的一种操作,用于提示编译器某个类型比编译器正在考虑的类型窄

考虑以下情况:

Class *a = [[Subclass alloc] init];
Subclass *b = a;
(假设
子类
的子类)

这不会编译,因为
a
静态定义的类型不包含在子类中。但赋值不会动态产生任何问题,因为
a
实际上用于存储
子类
对象

那么你要做什么呢?你放置一个cast
Subclass*b=(Subclass*)a;
来告诉编译器“相信我,忽略类型检查这个赋值,我断言它在运行时是有效的”,并自动删除编译错误。强制执行此行为当然会从代码中删除类型安全性,因此您必须知道自己在做什么

当然,要理解这种情况下强制转换的含义,您至少必须了解继承和对象


在您的特定情况下,方法的返回类型为
+(id)insertNewObjectForEntityForName:…
是ObjectVec中最不特定的对象类型,如果它不是像普通的
id
那样存储,则总是需要将其强制转换为某个对象,这只意味着将对象强制转换为括号内类的类型,例如,这里我们强制转换Defension UITableViewCell定制单元

    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = (CustomeCell*)[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
…class methode是另一个somthing,它的函数可以调用,而无需定义类的实例…当调用实例方法时,您需要这样做

Class *obj = [Class alloc] init];
[obj funtionName];
课堂教学法中你就是这样做的

[Class funtionName];

希望这会有所帮助。

这仅仅意味着将对象强制转换为括号内类的类型。例如,这里我们将defention UITableViewCell强制转换为CustomCell

    CustomeCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = (CustomeCell*)[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
…class methode是另一个somthing,它的函数可以调用,而无需定义类的实例…当调用实例方法时,您需要这样做

Class *obj = [Class alloc] init];
[obj funtionName];
课堂教学法中你就是这样做的

[Class funtionName];

希望这会有帮助。

实际上它会编译,但有警告。Obj-C类型检查比C++更严格。是的,我一般在说。弱类型检查器只是一个坏类型检查器,它们不应该存在。它们确实存在,只是为了帮助开发人员;<代码> ID <代码>不需要强制转换。(这不是因为Obj-C有弱类型检查,而是因为它是动态的。)对不起,我现在没有提到这个警告。。虽然ObjC很实用,但我倾向于在你没有意识到的情况下使用强制转换。。我不会说在任何情况下都不使用它是一个好的实践。要动态分派消息,您需要在任何情况下放松对类型检查器的一些约束,否则您将不被允许。我不是说弱者