zoukankan      html  css  js  c++  java
  • id类型

    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;  

    【程序结果】

    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类似。

  • 相关阅读:
    AOP实践--利用MVC5 Filter实现登录状态判断
    InstallShield12的安装破解方法
    phantomjs + python 打造一个微信机器人
    ASP.NET MVC4中@model使用多个类型实例的方法
    ssi技术
    ubuntu下面如何切换virtual_box的鼠标
    叫醒你的是闹钟,还是梦想?
    在linux命令行中直接执行php命令
    如何修改mysql默认的数据库密码
    【转】想要成功,请记住!
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/4090548.html
Copyright © 2011-2022 走看看