构造方法:用来初始化对象的方法,是个对象方法,-开头。构造方法其实就是将对象初始化的方法。以前对象的初始化都用[Person new];这里面的new方法太固定,耦合性太强,有时候没办法满足需求。其实new方法里面融合了alloc方法和init方法。实际上是[[Person alloc] init];alloc是类方法,目的是分配存储空间,init是对象方法,用来初始化对象的。
重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值。
重写构造方法的注意点:
1.先调用父类的构造方法([super init])
2.再进行子类内部成员变量的初始化
Person.h文件
#import <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
#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开头,比如:
<span style="font-size:24px;">- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;
- (id)initWithName:(NSString *)name andAge:(int)age;</span>
在对象初始化调用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 <Foundation/Foundation.h>
#import "Student.h"
int main()
{
@autoreleasepool {
Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 andNo:10];
}
return 0;
}
分类-Category:1.基本用途
如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式
继承
分类(Category)继承和分类有一些相似处,也有本质的区别。
2.格式
分类的声明:
@interface 类名 (分类名称)
// 方法声明
@end
分类的实现
@implementation 类名 (分类名称)
// 方法实现
@end
分类名写在原来类的右边,并且用小括号括住,只要是小括号括住的类名,一定是分类,固定格式.
NSString+Number.h文件
#import <Foundation/Foundation.h>
@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
- (int)numberCount;
@end
NSString+Number.m文件
<span style="font-size:24px;">#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</span><span style="font-size:18px;">
</span>
main .m文件
<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "NSString+Number.h"
int main()
{
int count = [@"9fdsfds543543" numberCount];
NSLog(@"%d", count);
return 0;
}</span><span style="font-size:18px;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);font-size:24px;">3.</span><span style="font-size:24px;"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">好处</span>:</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);font-size:24px;">一个庞大的类可以分模块开发</span>
一个庞大的类可以由多个人来编写,更有利于团队合作
4.分类的使用注意:
Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效