id类型

在Objective-C 中,id 类型是一个独特的数据类型。在概念上,类似Java 的Object 类,可以转换为任何数据类型。换句话说,id 类型的变量可以存放任何数据类型的对象。在内部处理上,

这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。

例如,下面定义了一个id类型的变量和返回一个id类型的方法:

  1. id anObject;
  2. - (id) newObject: (int) type;

id 和void *并非完全一样。下面是id在objc.h中的定义:

  1. typedef struct objc_object {
  2. Class isa;
  3. } *id;

从上面看出,id 是指向struct objc_object 的一个指针。也就是说,id 是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id 是一个指针,所以在使用id的时候不需要加星号,比如,

  1. id foo=nil;

上述语句定义了一个nil 指针,这个指针指向NSObject 的任意一个子类。而“id*foo=nil;”则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。

在Objective-C中,id取代了int类型成为默认的数据类型(在C语言中,int是默认的函数返回值类型),关键字nil 被定义为空对象,也就是值为0 的对象。关于更多的Objective-C基本类型,读者可以参考obj/objc.h文件。

下面举一个应用id 类型的例子。例子中定义了两个不同的类(一个是学生类Student,一个是会员类Member),这两个类拥有不同的成员变量和方法。

【例2-10】id类型应用。

学生类头文件Student.h的代码如下:

  1. #import <Foundation/Foundation.h>
  2. @interface Student : NSObject {
  3. int sid;
  4. NSString *name;
  5. }
  6. @property int sid;
  7. @property (nonatomic,retain) NSString *name;
  8. - (void) print;
  9. - (void) setSid: (int) sid andName: (NSString*) name;
  10. @end

学生类实现文件Student.m的代码如下:

  1. #import "Student.h"
  2. @implementation Student
  3. @synthesize sid,name;
  4. - (void) print{
  5. NSLog (@"我的学号是:%i,我的名字是:%@",sid,name) ;
  6. }
  7. - (void) setSid: (int) sid1 andName: (NSString*) name1{
  8. self.sid = sid1;
  9. self.name = name1;
  10. }
  11. @end

成员类头文件Member.h的代码如下:

  1. #import <Foundation/Foundation.h>
  2. @interface Member : NSObject {
  3. NSString *name;
  4. int age;
  5. }
  6. @property (nonatomic,retain) NSString *name;
  7. @property int age;
  8. - (void) print;
  9. - (void) setName: (NSString*) name1 andAge: (int) age1;
  10. @end

成员类实现文件Member.m的代码如下:

  1. #import "Member.h"
  2. @implementation Member
  3. @synthesize name,age;
  4. - (void) print{
  5. NSLog (@"我的名字是:%@,我的年龄是%i",name,age) ;
  6. }
  7. - (void) setName: (NSString*) name1 andAge: (int) age1{
  8. self.name = name1;
  9. self.age = age1;
  10. }
  11. @end

测试类源文件IdTest.m的代码如下:

  1. #import <Foundation/Foundation.h>
  2. #import "Member.h"
  3. #import "Student.h"
  4. int main (int argc, const char * argv[]) {
  5. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  6. Member *member1 = [[Member alloc]init];
  7. [member1 setName:@"Sam" andAge:36];
  8. id data;
  9. data = member1;
  10. [data print];
  11. Student *student1 = [[Student alloc]init];
  12. [student1 setSid:1122334455 andName:@"Lee"];
  13. data = student1;
  14. [data print];
  15. [student1 release];
  16. [member1 release];
  17. [pool drain];
  18. return 0;
  19. }

【程序结果】

  1. 我的名字是:Sam,我的年龄是36
  2. 我的学号是:1122334455,我的名字是:Lee

我们为这两个类分别创建了对象student1 和member1,并利用各自的设置方法设置了各自的属性值,然后创建了一个名为data 的id 类型对象,由于id 类型的通用性质,我们可以将创建好的对象赋值给data。

  1. data = member1;
  2. [data print];
  3. .......
  4. data = student1;
  5. [data print];

当上述第一条语句执行的时候,data 被转换成为了Member 类型的对象member1,转换完成后,就可以调用member1 的方法print,通过程序结果证明转换是成功的。student1 的转换过程于member1类似。

id类型的更多相关文章

  1. OC基础--构造方法 id类型

    new方法实现原理: new做了三件事情 1.开辟存储空间  + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Pe ...

  2. OC id类型

    id数据类型可存储任何类型的对象.从某种意义说,它是一般对象类型. -------------------------"NormalMan.h"------------------ ...

  3. oc 中的id类型与类型转换

    id是oc语言中一个独特的数据类型.一种通用对象类型.可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象. 使用示例: Animal * dog = [[Dog alloc]init] ...

  4. 关于void*类型的用法(相当于OC中的id类型)

    关于void*类型的用法(相当于OC中的id类型) 1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*.float*甚至抽象数据类型的指 ...

  5. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型

    点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...

  6. 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。

    一.property 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性 如果只提供了getter方法, 那么我们称这个属性为只读属性 如果只提供了setter ...

  7. void *与id类型的相互转换

    void *与id类型相互转换 在MRC下,void *与id类型相互转换完全没问题. id obj = [[NSObject alloc] init]; void *p = (void *)p; o ...

  8. 对于Serializable id类型的数据的测试

    今天编写了一个这样的例子,然后进行了Junit测试,但是发现类型总是不匹配,最后测出如下 public <T> void deleteEntry(Class<T> t, Ser ...

  9. mysql的数据类型int、bigint、smallint 和 tinyint及id 类型变换

    bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. int 从 ...

随机推荐

  1. Apache Shiro 集成-Cas

    http://blog.csdn.net/peterwanghao/article/details/8825008 Shiro集成CAS是在1.2版本里新增的功能. Shiro-cas模块将应用作为C ...

  2. Android 获取手机总内存和可用内存等信息

    在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小.这个该如何实现呢? 通过读取文件"/proc/meminfo"的信息能够获 ...

  3. 在Windows下使用MinGW静态编译Assimp

    使用MinGW静态编译Assimp 到了5月份了,没有写一篇日志,于是自己从知识库里面拿出一篇文章充数吧.这次将要解说怎样在Windows下使用MinGW静态编译Assimp. Assimp是眼下比較 ...

  4. Linux系统下UDP发送和接收广播消息小样例

    [cpp] view plaincopy // 发送端 #include <iostream> #include <stdio.h> #include <sys/sock ...

  5. Python 基础学习

    http://www.cnblogs.com/Wxtrkbc/p/5486253.html

  6. rpm安装mysql 默认安装目录

    MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为Linux本身的目录结构就比较 ...

  7. CentOS7安装Cobbler

    安装EPEL源 # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 安装cobbler ...

  8. Linux终端Ctrl相关快捷键

    快速跳至行首:Ctrl+A 快速跳至行尾:Ctrl+E 向前删除至行首:Ctrl+U 向后删除至行尾:Ctrl+K 向后删一个单词:Ctrl+D 清屏:Crtl+L(clear)

  9. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  10. 11.9 noip模拟试题

    NOIP2016 模拟赛——那些年,我们学过的文化课背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, 而 ...