博客正式开通啦!以后会每天为大家更新知识,将过去学习的笔记发布出来。供大家学习交流。

在Objective-C 中,id 类型是一个独特的数据类型。在概念上,类似Java 的Object 类,可以转换为任何数据类型。换句话说,id 类型的变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。例如,下面定义了一个id类型的变量和返回一个id类型的方法:

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

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

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

下面做一个案例来分析id数据类型

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

#import <Foundation/Foundation.h>

 @interface Student : NSObject

{

    NSString *_name;  //定义成员变量name;

    NSString *_sid;

}

@property(nonatomic,strong)NSString *name;

@property(nonatomic,strong)NSString *sid;

+(Student *)studentWithName:(NSString *)name andSid:(NSString *)sid;

-(instancetype)initWithName:(NSString *)name andSid:(NSString *)sid;

-(void)print;

@end

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

  1. #import "Student.h"
  2. @implementation Student
  3. -(instancetype)initWithName:(NSString *)name andSid:(NSString *)sid
  4. {
  5.     self = [super init];
  6.     if (self) {
  7.         _name = name;
  8.         _sid = sid;
  9.     }
  10.     return self;
  11. }
  12. +(Student *)studentWithName:(NSString *)name andSid:(NSString *)sid
  13. {
  14. //在类方法中由于还没有创建实例,所有self不能使用
  15.     return [[Student alloc]initWithName:name andSid:sid];//类方法是通过类名使用的,不能创建新的实例变量
  16. }
  17. -(void)print
  18. {
  19.     NSLog(@"name = %@,sid = %@",_name,_sid);
  20. }
  21. @end

测试文件代码main.m

  1. #import <Foundation/Foundation.h>
  2. #import "Student.h"
  3. int main(int argc, const char * argv[]) {
  4.     @autoreleasepool {
  5.         Student *stu = [Student studentWithName:@"zhangsan" andSid:@"123456"];
  6.         [stu print];
  7.         id temp;
  8.         temp = stu;
  9.         [temp print];
  10.     }
  11.     return 0;
  12. }

 结果输出如下: