黑马程序员——OC基础---构造和分类(一)
------- android培训、ios培训、期待与您交流! ----------
内容概括:
1、构造方法:用来初始化对象的方法。
2、分类:给某一个类扩充一些方法(不改变原来类的代码)。
一.构造方法:
示例:
Person *p = [person new];
Person *p = [[Peron alloc] init];
1、分配存储空间。 +alloc方法
2、初始化。 -init方法
说明:以上语句可以写成person *p = [ [person alloc] init ];
Alloc返回一个已经分配存储空间的对象,init对其进行初始化。
以上的init方法称之为构造方法。
应用场合:有时候我们创建对象需要其被创建时就有一个固定的初始值,这时就需要重写构造方法。
- ( id )init
Self = [super init]; // 调用父类方法,初始化父类变量及属性。
if( self != nill )
{
_age = age;
}
return self;
固定写法
- (id)init
{
if ( self = [ super init ] ) // 先调用父类方法。
{
_age = age;
}
构造方法遵循原则:
1、先调用父类init方法,对父类先进行初始化。
2、再进行子类内部成员变量的初始化。
自定义构造方法规范:
1、一定是对象方法,一定以 - 号开头。
2、返回值一定是id类型。
3、方法名一般以init开头。
代码实现:
#import < foundation\foundation.h >
@interface Person : NSObject
{
NSString *_name;
}
@property NSString *name;
-(id) initwithName : (NSString*)name;
{
If ( self = [ super init ];
//继承自父类的属性需要使用父类方法进行初始化。
{
_name = name; // 大括号内只写子类特有的属性。
}
}
@end;
总结与思考:
1、分工明确。
2、父类改动不影响子类 。
*疑问:代码采用了继承方法,子类中拥有父类的一切属性,为什么还要去父类中进行初始化。
二.分类、类别:
使用场景:给某一个类扩充一些方法(不改变原来类的代码)。
分类的特点:
1、方便团队开发,给一个类写诸多模块以增加方法。
2、只能增加方法,不能增加成员变量。
3、分类方法实现中可以访问原来生命的成员变量。
4、分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来方法不可用。
5、方法调用的优先级:分类—>原来类—>父类。
6、同为分类时,优先执行最后一个编译的文件。
代码实现:
#import "Person.h"
@interface Person (MJ) // 分类的写法和形式,这种形式都是分类。
- (void)study; // 增加一个方法,分类的目的。
@end
@implementation Person (MJ)
- (void)study
{
NSLog(@"学习-----%d", _age);
}
@end