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. 获取手机root的方法

  2. js_面向对象编程

    主要内容 值类型与引用类型的特征 深拷贝与浅拷贝 对象的动态特性 构造函数的执行过程 异常处理 dom操作(略) <!DOCTYPE html> <html> <head ...

  3. hdu 1317 XYZZY【Bellheman_ford 判断正环小应用】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1317 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. malloc()与calloc差别

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  5. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...

  6. LabVIEW中的UDP通信

    UDP(user datagram protoco1)提供向接收端发送信息的最简便的协议,与TCP不同,UDP不是面向连接的可靠数据流传输协议,而是面向操作的不可靠数据流传输协议.UDP在数据传输之前 ...

  7. hadoop错误org.apache.hadoop.util.DiskChecker$DiskErrorException Could not find any valid local directory for

    错误: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory ...

  8. java 数组注意点

    int[] array1 = new int[4]; int[] array2 = new int[6]; int[] array3 = new int[8]; array2 = array1; ar ...

  9. IHttpModule实现URL重写

    1.用自定义IHttpModule实现URL重写 一般来说,要显示一些动态数据总是采用带参数的方式,比如制作一个UserInfo.aspx的动态页面用于显示系统的UserInfo这个用户信息表的数据, ...

  10. jstl中添加自定义的函数

    由于jstl中提供的函数未必能够满足我们的要求,而我们又希望能够像jstl提供的函数那样能够轻松方便使用,那么可以通过自定义函数补充jsltl函数.给jstl添加自定义函数需要以下步骤: 定义一个st ...