id类型
来源:互联网 发布:犀牛软件分解模型 编辑:程序博客网 时间:2024/06/08 07:06
在Objective-C 中,id 类型是一个独特的数据类型。在概念上,类似Java 的Object 类,可以转换为任何数据类型。换句话说,id 类型的变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。例如,下面定义了一个id类型的变量和返回一个id类型的方法:
- id anObject;
- - (id) newObject: (int) type;
id 和void *并非完全一样。下面是id在objc.h中的定义:
- typedef struct objc_object {
- Class isa;
- } *id;
从上面看出,id 是指向struct objc_object 的一个指针。也就是说,id 是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id 是一个指针,所以在使用id的时候不需要加星号,比如,
- 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的代码如下:
- #import <Foundation/Foundation.h>
- @interface Student : NSObject {
- int sid;
- NSString *name;
- }
- @property int sid;
- @property (nonatomic,retain) NSString *name;
- - (void) print;
- - (void) setSid: (int) sid andName: (NSString*) name;
- @end
学生类实现文件Student.m的代码如下:
- #import "Student.h"
- @implementation Student
- @synthesize sid,name;
- - (void) print{
- NSLog (@"我的学号是:%i,我的名字是:%@",sid,name) ;
- }
- - (void) setSid: (int) sid1 andName: (NSString*) name1{
- self.sid = sid1;
- self.name = name1;
- }
- @end
成员类头文件Member.h的代码如下:
- #import <Foundation/Foundation.h>
- @interface Member : NSObject {
- NSString *name;
- int age;
- }
- @property (nonatomic,retain) NSString *name;
- @property int age;
- - (void) print;
- - (void) setName: (NSString*) name1 andAge: (int) age1;
- @end
成员类实现文件Member.m的代码如下:
- #import "Member.h"
- @implementation Member
- @synthesize name,age;
- - (void) print{
- NSLog (@"我的名字是:%@,我的年龄是%i",name,age) ;
- }
- - (void) setName: (NSString*) name1 andAge: (int) age1{
- self.name = name1;
- self.age = age1;
- }
- @end
测试类源文件IdTest.m的代码如下:
- #import <Foundation/Foundation.h>
- #import "Member.h"
- #import "Student.h"
- int main (int argc, const char * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- Member *member1 = [[Member alloc]init];
- [member1 setName:@"Sam" andAge:36];
- id data;
- data = member1;
- [data print];
- Student *student1 = [[Student alloc]init];
- [student1 setSid:1122334455 andName:@"Lee"];
- data = student1;
- [data print];
- [student1 release];
- [member1 release];
- [pool drain];
- return 0;
- }
【程序结果】
- 我的名字是:Sam,我的年龄是36
- 我的学号是:1122334455,我的名字是:Lee
我们为这两个类分别创建了对象student1 和member1,并利用各自的设置方法设置了各自的属性值,然后创建了一个名为data 的id 类型对象,由于id 类型的通用性质,我们可以将创建好的对象赋值给data。
当上述第一条语句执行的时候,data 被转换成为了Member 类型的对象member1,转换完成后,就可以调用member1 的方法print,通过程序结果证明转换是成功的。student1 的转换过程于member1类似。
- data = member1;
- [data print];
- .......
- data = student1;
- [data print];
- id类型
- id类型
- id类型
- id类型
- id类型
- id类型 和 instancetype类型
- id 类型的缺陷
- OC之id类型
- OC中id类型
- @interface 、类型id
- 007.id 类型
- 007.id 类型
- 78,id 动态类型
- OC中的id类型
- OC id 类型
- elasticsearch 索引 类型 id
- Objective-C id类型
- 11.7 id 类型 、nil 类型是什么 id 与void 不一样。。。。。。
- PhoneGap 中navigator.notification.confirm 的用法详解
- ZCA白化变换推导——Learning Multiple Layers of Features from Tiny Images
- 版本控制-SVN版本库的搭建方式
- RTSP 协议分析 (一)
- 【iOS】搬迁代码后,CoreData会让程序跑不起来
- id类型
- 引用计数与内存管理
- BestCoder Round #3 A,B
- windows 7 安装 sam-ba at91 usb to serial converter 驱动不成功的解决
- 用MC替代session维持登录状态
- Type=MyISAM CHARACTER SET utf8 解说
- cocos2dx 3.x Tiled地图的认识
- 真正爱一个人,是可以无私的付出
- ConnectivityManager判断网络状态及wifi,数据流量