构造方法:用来初始化对象的方法,是个对象方法,-开头。构造方法其实就是将对象初始化的方法。以前对象的初始化都用[Person new];这里面的new方法太固定,耦合性太强,有时候没办法满足需求。其实new方法里面融合了alloc方法和init方法。实际上是[[Person alloc] init];alloc是类方法,目的是分配存储空间,init是对象方法,用来初始化对象的。
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值。
重写构造方法的注意点:
1.先调用父类的构造方法([super init])
2.再进行子类内部成员变量的初始化
Person.h文件
#import
@interface Person : NSObject
@property(nonatomic,assign) int age;
@end
Person.m文件
#import "Person.h"
@implementation Person
- (id)init
{
if ( self = [super init] )
{ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
}
@end
main.m文件
#import
#import "Person.h"
#import "Student.h"
int main()
{
Person *p = [[Person alloc] init];
return 0;
}
此时经过重写init方法后,_age初始值就为10.
重写-init方法
- (id)init
{
// 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
self = [super init]; // 当前对象 self
// 2.如果对象初始化成功,才有必要进行接下来的初始化
if (self != nil)
{ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
}
自定义构造方法:在对象初始化的时候,传一些参数,让成员变量值随着变化。
自定义构造方法的规范:
1.一定是对象方法,一定以 - 开头
2.返回值一般是id类型
3.方法名一般以initWith开头,比如:
- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age;
在对象初始化调用init方法时,传一些参数。
Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 ;
在.m文件中对自定义的构造方法进行实现
#import “Student.h”
@implementation Student
- (id)initWithName:(NSString *)name andAge:(int)age
{
if ( self = [super init] ) //如果当前对象初始化成功,即self!= nil;
{
_name = name;
_age = age;
}
return self;
}
@end
main.m中,对象p初始化的时候传一些参数,此时成员变量就是传的参数值。
#import
#import "Student.h"
int main()
{
@autoreleasepool {
Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 andNo:10];
}
return 0;
}
分类-Category:分类名写在原来类的右边,并且用小括号括住,只要是小括号括住的类名,一定是分类,固定格式.
NSString+Number.h文件
#import
@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
- (int)numberCount;
@end
NSString+Number.m文件
#import "NSString+Number.h"
@implementation NSString (Number)
+ (int)numberCountOfString:(NSString *)str
{
return [str numberCount];
}
- (int)numberCount
{
int count = 0;
for (int i = 0; i='0' && c<='9' )
{
count++;
}
}
return count;
}
@end
#import
#import "NSString+Number.h"
int main()
{
int count = [@"9fdsfds543543" numberCount];
NSLog(@"%d", count);
return 0;
}
3.好处:
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
4.分类的使用注意:
Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效