加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Objective-C中的星号用法

发布时间:2020-12-16 10:52:06 所属栏目:百科 来源:网络整理
导读:我有一个关于在Objective-C中使用星号的问题.需要明确的是:我理解指针是什么以及程序C中的所有内容.我想知道两件事情: 1)为什么所有(引用)Objective-C对象指针?为什么不是普通变量? (即NSArray数组= [[NSArray alloc] init];) 2)为什么在调用方法时省略
我有一个关于在Objective-C中使用星号的问题.需要明确的是:我理解指针是什么以及程序C中的所有内容.我想知道两件事情:

1)为什么所有(引用)Objective-C对象指针?为什么不是普通变量? (即NSArray数组= [[NSArray alloc] init];)

2)为什么在调用方法时省略星号?

谢谢!

解决方法

1) Why are all (references to)
Objective-C objects pointers? Why not
plain variables? (i.e. NSArray array =
[[NSArray alloc] init];)

将Objective-C对象想象成一个美化的结构片刻.

NSArray数组;在本地范围内,将是在堆栈上“分配”的对象. NSArray *数组;表示由大量内存支持的对象,通常从堆中分配.

很久很久以前,我们决定Objective-C不支持堆栈上的对象.大多数情况下,因为这样做会使内存管理成为一个巨大的混乱(主要是,堆栈上的某些内容根本没有任何意义).

由于Objective-C被设计为C的纯超集,并且与C不同,并不试图修改C的基本行为,因为在那里看起来很自然.

请注意,id会破坏它,但id也是完全通用的类型.事实上,它可能在堆栈上有Objective-C对象.在Snow Leopard中,Blocks实际上是Objective-C对象,它们确实从堆栈开始.但是,您不支持在堆栈上创建自己的对象.

2) Why do you omit the asterisk when
calling method?

因为您没有取消引用指向该对象的指针,并且指向该对象的指针在方法实现本身中是至关重要的.当你说…

[anArray objectAtIndex: 5];

……这完全等同于写作……

objc_msgSend(anArray,@selector(objectAtIndex:),5);

……当你实施所述方法时….

- (id) objectAtIndex: (NSUInteger) anIndex;

……它完全等同于实现这个C函数……

id object_at_index(id self,SEL _cmd,NSUInteger anIndex) { ... }

也就是说,Objective-C方法实际上只是一个带有两个或更多参数的C函数.事实上,你可以将这行代码粘贴到任何方法实现中,它只会“正常工作”:

NSLog(@"method %@",NSStringFromSelector(_cmd));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读