id类型
id类型
在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 = member1;
- [data print];
- .......
- data = student1;
- [data print];
当上述第一条语句执行的时候,data 被转换成为了Member 类型的对象member1,转换完成后,就可以调用member1 的方法print,通过程序结果证明转换是成功的。student1 的转换过程于member1类似。
id类型的更多相关文章
- OC基础--构造方法 id类型
new方法实现原理: new做了三件事情 1.开辟存储空间 + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Pe ...
- OC id类型
id数据类型可存储任何类型的对象.从某种意义说,它是一般对象类型. -------------------------"NormalMan.h"------------------ ...
- oc 中的id类型与类型转换
id是oc语言中一个独特的数据类型.一种通用对象类型.可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象. 使用示例: Animal * dog = [[Dog alloc]init] ...
- 关于void*类型的用法(相当于OC中的id类型)
关于void*类型的用法(相当于OC中的id类型) 1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*.float*甚至抽象数据类型的指 ...
- Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...
- 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。
一.property 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性 如果只提供了getter方法, 那么我们称这个属性为只读属性 如果只提供了setter ...
- void *与id类型的相互转换
void *与id类型相互转换 在MRC下,void *与id类型相互转换完全没问题. id obj = [[NSObject alloc] init]; void *p = (void *)p; o ...
- 对于Serializable id类型的数据的测试
今天编写了一个这样的例子,然后进行了Junit测试,但是发现类型总是不匹配,最后测出如下 public <T> void deleteEntry(Class<T> t, Ser ...
- mysql的数据类型int、bigint、smallint 和 tinyint及id 类型变换
bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. int 从 ...
随机推荐
- 【转】Android异常:that was originally added here
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 02-19 15:08:02.228: E/WindowManager(22172): Activity ...
- HibernateTemplate的find(String querystring)返回值具体解释
项目源代码中出现例如以下代码: HibernateTemplate ht =-- List<Object[]> tempList = ht.find(String querystring) ...
- 二维码URL自己主动辨别Android和ISO设备,以便扫码后倒入不同的下载链接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 开源免费天气预报接口API以及全国全部地区代码!!(国家气象局提供)
国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data ...
- QTreeWidget实现动态加载本地文件系统
QT之前没有接触过,之所以做这个也是被临时拉去GoldenFarm组去做渲染的客户端:还别说,虽说是第一次,做出来的这个东西倒是挺让我满意的.先说一下具体需求,然后再上图吧: 渲染时在选择场景文件时, ...
- NDK开发之访问域
Java有两类域,实例域和静态域.类的每个实例都有自己的实例域副本,而一个类的所有实例共享一个静态域(Java SE基础). JNI提供了相应的函数来访问这两类域,总体步骤是这样的: 1.通过对象引用 ...
- Android 自定义View修炼-自定义可动画展开收缩View的实现
有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现. 本例中,采用继承FrameLayout来实现自定义的ExpandView.下面将详细介绍各 ...
- wps批量使标题靠文档左边
- 模版引擎(NVelocity)开发
在net中用模版开发,在handler中用到了大量的html代码.为解决这个问题,我可以采用模版引擎(NVelocity)进行开发.1.首先需要将NVelocity.dll文件放入项目,其次引用.2. ...
- [DEncrypt] HashEncode--哈希加密帮助类 (转载)
点击下载 HashEncode.zip 这个类是关于加密,解密的操作,文件的一些高级操作1.HashEncode 得到随机哈希加密字符串2.HashEncode 得到一个随机数值3.HashEncod ...