[学习交流] OC学习笔记之id类型及应用场景

1、NSObject访问子类方法
NSObject是所有类的基类,可以指向任何子类
例如:
  1. #import <Foundation/Foundation.h>
  2. #pragma mark Animal类声明部分
  3. @interface Animal: NSObject
  4. -(void)eat;
  5. @end
  6. #pragma mark Animal类实现部分
  7. @implementation Animal
  8. -(void)eat{
  9.     NSLog(@"Animal eat...");
  10. }
  11. @end
  12. #pragma mark Dog类声明部分
  13. @interface Dog: Animal
  14. -(void)eat;
  15. @end
  16. #pragma mark Dog类实现部分
  17. @implementation Dog
  18. -(void)eat{
  19.     NSLog(@"Dog eat...");
  20. }
  21. @end

  22. int main(int argc, const char * argv[])
  23. {

  24.     @autoreleasepool {
  25.         NSObject *obj = [Animal new];
  26.         NSObject *obj2 = [Dog new];
  27.         
  28.         Animal *ani =[Dog new];
  29.         [ani eat];
  30.         //访问子类特有的方法
  31.         [(Animal*)obj eat];
  32.         [(Dog*)obj2 eat];
  33.         
  34.     }
  35.     return 0;
  36. }
复制代码


打印结果:
2015-10-05 10:36:57.614 Demo01[1278:303] Dog eat...
2015-10-05 10:36:57.616 Demo01[1278:303] Animal eat...
2015-10-05 10:36:57.617 Demo01[1278:303] Dog eat...

2、id是一种通用的对象类型,它可以用于存储属于任何类的对象
它也可以理解为【万能指针】
【注意】id在定义的时候已经包含了“*”,id指针只能访问os的对象
id类型的定义:
typedef struct objc object{
   Class *isa;
}id;


例如:
      
  1. //id类型使用
  2.         id dog = obj2;
  3.         id animal = obj;
  4.         //id类型使用时不会有类型检查,编译器在遇到id后就认为它是动态类型,就不会检查它的类型
  5.         [dog eat];//狗在跑
  6.         [animal eat];//动物在吃
复制代码

打印结果:
2015-10-05 10:43:32.727 Demo01[1338:303] Dog eat...
2015-10-05 10:43:32.727 Demo01[1338:303] Animal eat...


3、id和instancetype的异同
ios5之后推出了instancetype类型
1)相同点
都可以作为方法的返回类型
2)不同点
A、instancetype可以返回方法所在类相同类型的对象,id只能返回未知类型的对象。
B、instancetype只能作为返回值,不能像id那样作为参数



FROM: http://bbs.itheima.com/thread-247063-1-1.html



动态数据类型id:

数据类型常用的有:
1.int整型;
2.double双精度型;
3.float单精度型;
4.char字符类型;
等......
数据类型的用途是什么呢?
    在计算机语言中,数据类型有三种用途,
1.定义变量;
2.作为函数的参数;
3.作为函数的返回值.
默认情况下,所有的数据类型都是静态数据类型.
默认数据类型的特点如下:
在编译时就知道变量的类型,知道变量中有哪些属性和方法,在编译的时候就可以访问这些属性和方法,并且如果通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错;
id也是一种数据类型,并且是一种动态数据类型,那么id和其他数据类型一样,也有同样的作用;
动态数据类型的特点:
在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道真实的数据类型,并且如果通过动态数据类型定义变量,如果访问了不属于动态数据类型的属性和方法,编译器不会报错.
在多态中,通过静态数据类型定义变量,不能调用子类特有的方法;
  Animal * dog = [[Dog alloc]init];//使用父类接收子类的实例对象;

 Dog * dd = (Dog *)dog;//强制转换为子类类型

 [dd kanMen];//只有强制转换后才能调用子类特有的方法


在多态中,通过动态数据类型定义变量,可以调用子类特有的方法;

 id dog = [[Dog alloc]init];//创建一条狗;

  [dog kanMen];//这条狗可以直接调用Dog类具有的特有方法;

  [dog test];//这条狗还可以调用Dog私有的方法//只有实现没有生命的方法是私有方法;


在多态中,通过动态数据类型定义的变量,可以调用私有的方法
  
 Animal * dog = [[Dog alloc]init];//使用父类接收子类的实例对象;

 Dog * dd = (Dog *)dog;//强制转换为子类类型

  [dd test];//不能调用子类的私有方法

在多态中,如果父类有私有方法,只能在本类的方法中调用,如果子类中有父类私有方法的方法声明,则子类的对象可以直接调用父类的私有方法;(说明,OC中没有真正的私有方法,通过某种途径,父类也是可以调用其私有方法.)

id也存在弊端,由于动态数据类型可以调用任意方法, 所以有可能调用到不属于自己的方法, 而编译时又不会报错, 所以可能导致运行时的错误;

为了避免动态数据类型引发的运行时的错误, 一般情况下如果使用动态数据类型定义一个变量, 在调用这个变量的方法之前会进行一次判断, 判断当前变量是否能够调用这个方法;

if ([dog isKindOfClass:[Dog class]]) {

        //isKindOfClass , 判断指定的对象是否是某一个类, 或者是某一个类的子类

        [dog eat];

    }

//-------------------------------------------------------------------------------------------------------------

if ([dog isMemberOfClass:[Dog class]]) {

        // isMemberOfClass : 判断指定的对象是否是当前指定的类的实例

        [dog eat];

    }

id的应用场景: 多态, 可以减少代码量, 避免调用子类特有的方法需要强制类型转换

注释:
多态的条件:
      1.有继承关系
2.父类指向子类
       3.子类重写父类方法;

#import <Foundation/Foundation.h>

@interface Animal : NSObject

-(void)eat;

@implementation Animal

-(void)eat

{

    NSLog(@"吃饭");

}

-(void)test2

{

    NSLog(@"Animal私有方法test2");

}

@end

//———————————————————————//

@interface Dog : Animal

-(void)eat;

-(void)kanMen;

-(void)test2;

@end

@implementation Dog

-(void)eat

{

    NSLog(@"dog吃肉");

}

-(void)kanMen

{

    NSLog(@"汪汪叫");

}


-(void)test

{

    NSLog(@"私有方法test");

}

@end

//——————————————————————//

@interface Person : NSObject

-(void)eat:(Animal*)an;

@end

@implementation Person

-(void)eat:(Animal *)an

{

    [an eat];

}

@end

//———————————————————————//

int main(int argc, const char * argv[]) {

//    Animal *dog = [[Dog alloc]init];

//    [dog eat];


    //多态情况下,如果需要调用子类的特有属性,需要强制装换为子类类型

//    Animal * dog = [[Dog alloc]init];

//    Dog * dd = (Dog *)dog;

//    [dd kanMen];

//    [dd test];

    

    //使用id类型,在调用子类特有方法的时候,不用再强制转换,可以直接调用;

    //使用id类型,可以调用子类的私有方法;

    id dog = [[Dog alloc]init];

//    [dog kanMen];

//    [dog test];

    

    [dog test2];//



    

// 为了避免动态数据类型引发的运行时的错误一般情况下如果使用动态数据类型定义一个变量在调用这个变量的方法之前会进行一次判断判断当前变量是否能够调用这个方法

//    id dog2 = [[Dog alloc]init];

//    if ([dog2 isMemberOfClass:[Dog class]] ) {

//        [dog2 eat];

//    }

//  



//    Animal * an = [[Animal alloc]init]; 

//    Dog * dog = [[Dog alloc]init];  

//    Person * p = [[Person alloc]init];


//    [p eat:dog];

  

    //真正意义的面向对象;只剩下具体的对象,

    //这里是又创建了一个人,和分别创建了一条狗和一只猫,然后就是人去喂猫和狗;

    


return 0;

 }



from: http://blog.csdn.net/batac_lee/article/details/50576314

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值