首页 > 试题广场 >

对于语句NSString*obj = [[NSData al

[单选题]
对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象?
  • 编译时是NSString的类型;运行时是NSData类型的对象
  • 编译时是NSString的类型;运行时是NSString类型的对象
  • 编译时是NSData的类型;运行时是NSString类型的对象
  • 编译时是NSData的类型;运行时是NSData类型的对象
这道题的星号动态内存没学过也能做对!
比如说自定义类创建对象时,People p = new People(),的“内存演示”相信大家在b站网课都听到过。
p在【栈内存】,new的在【堆内存】;栈内存只是个【引用(地址)】,堆内存是实际的【对象存储空间】
【通过类比迁移】
栈内存的东西肯定是编译时通过,实际new的对象类型肯定在堆内存。
故:NSString是编译通过的,(alloc在C语言是动态内存分配,在Java肯定一样,很容易想到是自动创建对象),所以堆内存的NSData是堆内存、实际创建的对象。
当然,我说的这些也是“编译看左、运行看右”的本质原因

编辑于 2021-03-31 21:59:48 回复(0)
java表示全靠意Y
发表于 2018-02-18 13:35:33 回复(2)
这道题对我来说超纲了🌚
发表于 2021-03-17 07:41:45 回复(1)

首先,声明 NSString *testObject 是告诉编译器,testObject是一个指向某个Objective-C对象的指针。因为不管指向的是什么类型的对象,一个指针所占的内存空间都是固定的,所以这里声明成任何类型的对象,最终生成的可执行代码都是没有区别的。这里限定了NSString只不过是告诉编译器,请把testObject当做一个NSString来检查,如果后面调用了非NSString的方法,会产生警告。

接着,你创建了一个NSData对象,然后把这个对象所在的内存地址保存在testObject里。那么运行时,testObject指向的内存空间就是一个NSData对象。你可以把testObject当做一个NSData对象来用。

发表于 2017-03-21 15:40:47 回复(1)
编译看左边,运行看右边。
发表于 2021-02-22 17:43:41 回复(3)
编译左运行右
发表于 2021-07-22 19:37:20 回复(0)
编左运右
发表于 2021-06-30 21:59:52 回复(0)
编译看左边,运行看右边。
这是C++的题目,不太会呀。
发表于 2021-02-26 16:24:41 回复(1)
这真的是java类型题目?😥
发表于 2021-02-22 17:58:46 回复(1)
nsna是作为运行时的对象

发表于 2017-09-24 10:46:17 回复(0)

查了一下是IOS中的用法,我也不太清楚具体解释,应该类似于Java的赋值

发表于 2017-02-25 11:02:02 回复(0)