码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员——OC学习小结------构造方法,分类,方法的重写,SEL

时间:2015-05-27 15:15:49      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、万能指针,能指向\操作任何OC对象

typedef (NSObject *)  id;  //  id ==  NSObject

二、构造方法

  1、完整地创建一个可用的对象:

       1>分配存储空间  +alloc

       2>初始化 –init

  init就是构造方法:用来初始化对象的方法,是个对象方法,- 开头

  重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值

  2、重写构造方法的注意点:

    1>先调用父类的构造方法([super init])

    2>再进行子类内部成员变量的初始化

  3、重写-init方法举例

- (id)init
{

    // 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
    self = [super init]; // 当前对象 self
   
    // 2.如果对象初始化成功,才有必要进行接下来的初始化
    if (self != nil)
    { // 初始化成功
        _age = 10;
    }
   
    // 3.返回一个已经初始化完毕的对象
    return self;
}

  4、自定义构造方法的规范

    1>一定是对象方法,一定以 - 开头

    2>返回值一般是id类型

    3>方法名一般以initWith开头

    4>父类的属性交给父类方法去处理,子类方法处理子类自己的属性

@implementation Person
- (id)init
{
    if ( self = [super init] )
    {
        _name = @"Jack";
    }
    return self;
}

- (id)initWithName:(NSString *)name
{
    if ( self = [super init] )
    {
        _name = name;
    }
    return self;
}

- (id)initWithAge:(int)age
{
    if ( self = [super init] )
    {
        _age = age;
    }
    return self;
}

- (id)initWithName:(NSString *)name andAge:(int)age
{
    if ( self = [super init] )
    {
        _name = name;
        _age = age;
    }
    return self;
}
@end

@interface Student : Person
@property int no;
- (id)initWithNo:(int)no;
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no;
@end

@implementation Student
- (id)initWithNo:(int)no
{
    if ( self = [super init] )
    {
        _no = no;
    }
    return self;
}

// 父类的属性交给父类方法去处理,子类方法处理子类自己的属性
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
    // 将name、age传递到父类方法中进行初始化
    if ( self = [super initWithName:name andAge:age])
    {
        _no = no;
    }
    return self;
}

三、Category-分类

  1、分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法

  2、使用注意:

    1>分类只能增加方法,不能增加成员变量

    2>分类方法实现中可以访问原来类中声明的成员变量

    3>分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用

    4>方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类  --> 父类

#import <Foundation/Foundation.h>

@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
- (int)numberCount;
@end

#import "NSString+Number.h"
@implementation NSString (Number)

//  @"abc434ab43"

+ (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

四、load 和intialize 方法

  1、都是类方法(基类已声明,不必再声明)

  2、例如:

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
+ (void)test;
@end

#import "Person.h"

@implementation Person
+ (void)test
{
    NSLog(@"调用了test方法");
}

// 当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法
+ (void)load
{
    NSLog(@"Person---load");
}

// 当第一次使用这个类的时候,就会调用一次+initialize方法
+ (void)initialize
{
    NSLog(@"Person-initialize");
}
@end

  3、类的本质:类本身也是一个对象,是个Class类型的对象,简称类对象

五、description方法

  description方法默认返回的是“类名+内存地址”

void test2()
{
    Class c = [Person class];

    // 1.会调用类的+description方法
    // 2.拿到+description方法的返回值(NSString *)显示到屏幕上
    NSLog(@"%@", c);
}

void test1()
{
    Person *p = [[Person alloc] init];
    p.age = 20;
    p.name = @"Jack";

    // 默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址>
    // 1.会调用对象p的-description方法
    // 2.拿到-description方法的返回值(NSString *)显示到屏幕上
    // 3.-description方法默认返回的是“类名+内存地址”
    NSLog(@"%@", p);
}

六、SEL数据类型

  SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,其实消息就是SEL。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员——OC学习小结------构造方法,分类,方法的重写,SEL

标签:

原文地址:http://www.cnblogs.com/zhangxiaoshan/p/4533290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!