动态数据类型id

id相当于NSObject *

但是略有不同,NSObject *是静态数据类型

如Student继承Person继承NSObject,Person有age方法,Student有score方法

Person *p=[Student new];

[p score];会编译出错,不能直接访问子类方法

Student *s=(Student *)p;

[s score];强转之后可以调用

id obj1=[Person new];

[obj1 age];

id obj2=[Student new];

[obj2 score];

上面调用时都可以执行的,相比省略了强转这个步骤

但是[obj1 score];虽然编译时不会报错,但是运行时会报错,因为Person没有score方法

所以在使用id时最好在一些判断

if([obj1 isKindOfClass:[Student class]]){....};判断某对象(obj1)是否是某个类(Student),或者其子类

if([obj1 isMemberOfClass:[Student class]]){....};判断某对象(obj1)是否是某个类(Student)的实例对象

if([Student isMemberOfClass:[Person class]]){....};判断某个类(Student)是不是另一个类(Person)的子类

要注意的一点:

动态数据类型的可以访问私有方法以及只有实现没有声明的方法

时间: 2024-10-11 23:12:45

动态数据类型id的相关文章

OC基础(6)静态数据类型和动态数据类型

静态数据类型: 1.在编译时就知道变量的类型. 2.知道变量中有哪些属性和方法 3.在编译的时候就可以访问这些属性和方法, 4.通过静态数据类型定义变量, 如果访问了不属于静态数据类型的属性和方法, 那么编译器就会报错 5.默认情况下所有的数据类型都是静态数据类型(id除外) 动态数据类型: 1.在编译的时候编译器并不知道变量的真实类型, 只有在运行的时候才知道它的真实类型 2.并且如果通过动态数据类型定义变量, 如果访问了不属于动态数据类型的属性和方法, 编译器不会报错 id与NSObject

动态数据类型和静态数据类型

动态数据类型 Python是动态数据类型,变量不需要指定类型. Python的变量,可变的是指向,不可通过变量名修改其指向数据单元的内容. //函数id() 的作用是查看变量指向的内存地址.见help(id) //内存中分配两个单元,存放数字12和13. //x,y分别指向内存地址,类似C语言的指针 x=12 y=13 print 'x=',x,id(x) print 'y=',y,id(y) //让x指向y的地址 x=y print 'x=',x,id(x) print 'y=',y,id(y

object-c 继承多态 动态数据类型

在c#中我们知道有继承的.同样在object-c中也有继承. 例如我们写一个人类(父),一个学生类.我们可以这么写: demo: @interface Person:NSobject{ NSString *name; int age; NSDate brithDate; } -(NSString *) getInfo(); @end @interface Student:Person{ NSString* school; } @end object-c 中  我们在上个博客中知道  在objec

Js 添加动态修改id

//HTML代码 <table id="templateTable" > <tr> <td id="oneTd" > <div class="control-group"> <label class="control-label required"> <span class="help-inline"><font color=&q

js动态添加id

<script type="text/javascript"> function add_id(){ var dlall=document.getElementsByTagName('div'); for(i=0;i<dlall.length;i++){ dlall[i].id='id_'+i; } } window.onload=add_id; </script> <div>1</div> <div>2</div

OC基础 04

OC 基础04 [email protected]基本概念 >[email protected]是编译器的指令 >[email protected] 用在声明文件中告诉编译器声明成员变量的的访问器(getter/setter)方法 这样的好处是:免去我们手工书写getter和setter方法繁琐的代码 @property基本使用 1.在@inteface中,用来自动生成setter和getter的声明 示例: 用@property int age; // 就可以代替下面的两行 - (int)a

Foundation =&gt; Objective-C _ Part3

1. property 基本使用 - - - 编译器只要看到@property, 就会自动生成某一个属性的getter/setter方法的声明 2. @synthesize @synthesize是一个编译器指令, 它可以简化我们getter/setter方法的实现 什么是实现: 在声明后面写上大括号就代表着实现 在@synthesize后面告诉编译器, 需要实现哪个@property生成的声明 告诉@synthesize, 需要将传入的值赋值给谁和返回谁的值给调用者 如果在@synthesiz

关于Android中根据ID名动态获取资源的两个方法

在开发中, 我们习惯了类似下面这种方式去实现引用资源: context.getResources().getDrawable(R.drawable.flower); 但是,当我们提前知道这个资源的id,想动态去引用,而不是在id里面固化应该怎么办呢? 比如某个图片资源的id是R.drawable.test_1, 而且有序的还有test_2,test_3, 我们如何动态的去引用它们?这里有两种方案:直接用反射和用resource的getIdentifier()方法,它们原理都差不多利用反射实现.

1.5 万能指针 id

一. id id是一种数据类型,并且是一种动态数据类型 数据类型的用途: 1. 定义变量 2. 作为函数的参数 3. 作为函数的返回值 默认情况下所有的数据类型都是静态数据类型 静态数据类型的特点: 在编译时就知道变量的类型,知道变量中有哪些属性和方法 在编译的时候就可以访问这些属性和方法 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错 应用场景:多态,可以减少代码量,避免调用了子类特有的方法需要强制类型转换 id obj1 = [[Person