10-Objective-C特有语法:Category、类对象、description、SEL、NSLog输出增强

时间:2014-04-29 11:23:47   收藏:0   阅读:384

一、    分类-Category

1.        基本用途

  1>.继承

  2>.分类(Category)

2.        格式

@interface 类名 (分类名称)

// 方法声明

@end

@implementation 类名 (分类名称)

// 方法实现

@end

3.        好处

    给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数

    给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数

mamicode.com,码迷
mamicode.com,码迷
#import <Foundation/Foundation.h>

@interface NSString (Number)

+ (int)numberCountOfString:(NSString *)str;

- (int)numberCount;

@end
NSString+Number.h
mamicode.com,码迷
mamicode.com,码迷
mamicode.com,码迷
#import "NSString+Number.h"

@implementation NSString (Number)

+ (int)numberCountOfString:(NSString *)str
{   
    return [str numberCount];
}

- (int)numberCount
{
    int count = 0;  
    for (int i = 0; i<self.length; i++)
    {
        // 取出i这个位置对应的字符
        unichar c = [self characterAtIndex:i];
        
        // 如果这个字符是阿拉伯数字
        if ( c>=0 && c<=9 )
        {
            count++;
        }
    }   
    return count;
}

@end
NSString+Number.m
mamicode.com,码迷

5.        注意

 


 

二、    类对象(类的本质)

1.        类也是个对象

typedef struct objc_class *Class;

2.        +load和+initialize

l   在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

l   先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

l   先加载原始类,再加载分类

l   不管程序运行过程有没有用到这个类,都会调用+load加载

 

  l   在第一次使用某个类的时候(比如创建对象等),系统就会调用一次+initialize方法(且只能调用一次)

  l   先调用父类的,再调用子类的

3.        获取类对象的2种方式

Class c = [Person class]; // 类方法

或者

Person *p = [Person new];

Class c2 = [p class]; // 对象方法

4.        类对象调用类方法

Class c = [Person class];

Person *p2 = [c new];   // ps: 不能直接调用对象方法

 


 

三、    description方法

1.     -description方法

使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出  默认输出<类名:对象地址>

2.     + description方法

使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出

3.     修改NSLog的默认输出

4.     死循环陷阱

mamicode.com,码迷
- (NSString *)description
{
    // 下面这行代码会引发死循环
     NSLog(@"%@", self);    // 要打印出self的对象类名及地址 首先就会去调用description对象方法 如此就造成死循环
    return @"57576768";
}
mamicode.com,码迷

 

 


 

四、    SEL

1.        方法的存储位置

typedef struct objc_selector    *SEL;

2.        SEL对象的创建

SEL s = @selector(test);    // s即为 test方法的指针*

SEL s2 = NSSelectorFromString(@"test");

3.        SEL对象的其他用法

// 将SEL对象转为NSString对象

NSString *str = NSStringFromSelector(@selector(test));

 

Person *p = [Person new];

// 调用对象p的test方法

[p performSelector:@selector(test)];  // performSelector方法为:执行哪一个SEL对象

 


 

五、    NSLog输出增强

// 下面的代码会引发死循环

- (void)test {

    [self performSelector:_cmd];

}

10-Objective-C特有语法:Category、类对象、description、SEL、NSLog输出增强,码迷,mamicode.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!