标签:
------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