Objective-C 编程全解-第08章 类NSObject和运行时系统 上

08 NSObject和运行时系统 上

    本章将对根类NSObject的主要功能和NSObject与运行时系统之间的关系进行说明

8.1 NSObject

8.1.1 根类的作用

    作为一门动态语言Objective-C有很多动态的特征,因此,ObjectiveC不仅需要编译环境,同时还需要一个运行时系统runtime system)来执行编译好的代码。运行时系统扮演的角色类似于ObjectiveC的操作系统,它负责完成对象生成、释放时的内存管理,未发来的消息查找对应的处理方法等。

    通常情况下,程序中无法直接使用运行时系统提供的功能。根类方法中提供了运行时系统的基本功能。继承了NSObject的所有类都可以自由地使用的运行时系统的功能,也就是说,根类就相当于运行时系统的一个接口


8.1.2 类和实例

    NSObject是有一个实例变量,就是Class类型的变量isaisa用于标识实例对象属于哪个类对象。因为isa决定着实例变量和类的关系,非常重要,所以子类不可以修改isa的值。另外,也不能通过直接访问isa来查询实例变量到底属于哪个类,而要通过实例方法class来完成查询。

    下面对类和实例变量的相关方法进行说明。NSObject的方法与其说是为自己定义的,不如说是为其子类和所有的实例对象而定义的

    -(Class)class

        返回消息接受者所属类的类对象。

    +(Class)class

        返回类对象。

    虽然可以使用类名作为消息的接受者来调用类方法,但当类对象是其他消息的参数,或者将类对象赋值给变量的时候,需要通过这个类方法来获取类对象。

    -(id) self

    -(BOOL) isMemberOfClass:(Class)aClass

        判断消息接受者是不是参数aClass类的对象。

    -(BOOL)isKindOfClass:(Class)aClass

        判断消息接受者是否是参数aClass类或者aClass类的子类的实例。这个函数和isMemberOfClass:的区别在于当消息的接受者是aClass的子类的实例时也会返回YES

    +(BOOL)isSubclassOfClass:(Class)aClass

        判断消息接收者是不是参数aClass的子类或自身,如果是则返回YES

    -(Class)superclass

        返回消息接收者所在类的父类的类对象。NSObject类对象的父类的类对象是null[NSProxy superclass]也是null

    +(class)superclass

        返回消息接受类的父类的类对象。

            BOOL sub1 = [NSString isSubclassOfClass:[NSObject class]];

            NSLog(@"%u",sub1);//1

    

           BOOL sub2 = [NSObject isSubclassOfClass:[NSObject class]];

            NSLog(@"%u",sub2);//1

    

            NSLog(@"%@",[NSString superclass]);//NSObject

            NSLog(@"%@",[NSObject superclass]);//(null)

            NSLog(@"%@",[NSProxy superclass]);//(null)


8.1.3 实例对象的生成和释放

8.1.4 初始化

+(void)initialize

    被用于类的初始化,也就是对类中共同使用的变量进行初始化设定定。这个方法会在类收到的第一个消息之前被自动执行,不允许手动调用

+(id)new

    newallocinit的组合。new方法返回的实例对象的所有者就是调用new方法的对象。但是,把allocinit组合定义的new并没有什么优点。

    根据类的实现的不同,new方法并不会每次都返回一个全新的实例对象。有时new方法会返回对象池中预先生成的对象,也有可能每次都返回同一个对象。


8.1.5 对象的比较

- (BOOL)isEqual:(id)anObject;

    NSString中如果调用isEqual:是否会调用isEqualToString:

        //

        //  NSString+TestString.h

        //  Test

        //

        //  Created by ranzhou on 16/6/7.

        //  Copyright © 2016 ranzhouee. All rights reserved.

        //


        #import <Foundation/Foundation.h>


        @interface NSString (TestString)

        -(BOOL)isEqualToString:(NSString *)aString;

        @end


        //

        //  NSString+TestString.m

        //  Test

        //

        //  Created by ranzhou on 16/6/7.

        //  Copyright © 2016 ranzhouee. All rights reserved.

        //


        #import "NSString+TestString.h"


        @implementation NSString (TestString)


        -(BOOL)isEqualToString:(NSString *)aString

        {

            NSLog(@"%s",__func__);

            return YES;

        }


        @end

    测试代码:

         NSString *str1 = @"123456";

        NSString *str2 = @"654321";

        NSLog(@"%u",[str1 isEqual:str2]);

    测试发现isEqual:并未调用isEqualToString:方法,在NSString中还是使用isEqualToString:比较好。

   另外isEqual:方法和hash方法还有很多关联指出件第9


8.1.6 对象的内容描述

+(NSString *)description; //使用NSLog(@“%@”,obj);的时候,就是调用obj的description来获取描述信息。

-(NSString *)description;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值