一.构造方法
1调用+alloc分配存储空间
Person *p = [Person alloc]
2初始化 -init
Person *p1 = [p init];
//可以整合为一句
Person * p2 = [[Person alloc] init];
3如果有一些特殊需要,例如创建出来的对象是一个特定值,可以重写init方法,进行初始化
(id)init
{
1,调用回super的init方法
self = [super init];
// 如果对象初始化成功,才有必要进行接下来的初始化
if ( self !=nil )
{ // 初始化成功
_age = 10;<pre name="code" class="objc"> // 返回一个初始化完毕的对象
return self;
}
- (id)init
{
if ( self = [super init] )
{ <pre name="code" class="objc"> _age = 10;
}
return self;
<span style="font-family: Arial, Helvetica, sans-serif;">} </span>
<span style="font-weight: bold; font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">构造方法</span>
<span style="font-weight: bold; font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">首先会调用父类的构造方法[super init],</span>
当父类中有拥有成员变量,子类需要增加成员变量的时候,只需要更改子类的init方法就可以达到
4.自定义构造方法:
- (void)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{<pre name="code" class="objc"> // 父类中的name和age留给父类初始化,这里只初始化自己
if( self =[super initWithName:name andAge:age] )
_no = no;
return self;
二.分类 :category
1.分类依赖于类,不改变原来类的模式下,给原来类扩充方法,不修改原来类的代码。
#import "Person.h" // 给person这个类增加方法必须包含person的头文件</span><pre name="code" class="objc">// @interface 类名(分类名称)
@interface Person (SY)
分类不能增加成员变量,只能增加方法。
调用方法时,优先去分类中找,然后再去父类中找。
分类会重新实现原来类中的方法,覆盖原来方法,导致原来方法无法使用。
分类-》原来类-》父类
练习:给NSString扩充一个类方法,计算某个字符串阿拉伯数字
+ (int)numberCountOfString:(NSString *)str
{<pre name="code" class="objc"> int count = 0<pre name="code" class="objc"> for (int i = 0; i < str.length; i++)
<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">unichar c = [str characterAtIndex:i];</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"></span></span><pre name="code" class="objc"><span style="white-space:pre"> </span>if(c>='0' && c<='9')
<span style="white-space:pre"> </span>{<pre name="code" class="objc"><span style="white-space:pre"> </span> count++;<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="white-space:pre"> </span>}
}<pre name="code" class="objc"> return count;
}
给NSString扩充一个对象方法,计算某个字符串阿拉伯数字 -(int)numberCount<pre name="code" class="objc">{<pre name="code" class="objc"> int count = 0;<pre name="code" class="objc"> for (int i = 0; i < self.length; i++)
{<pre name="code" class="objc"><span style="white-space:pre"> </span>unichar c = [self characterAtIndex:i];<pre name="code" class="objc"> // 如果自负是阿拉伯数字,就让count+1;<pre name="code" class="objc"> if(c>='0' && c<='9')
<span style="font-family: Arial, Helvetica, sans-serif;"> </span> <span style="font-family: Arial, Helvetica, sans-serif;">count++;</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>}</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>}</span><pre name="code" class="objc"><span style="white-space:pre"> </span>return count;
}
调用方法:
int count = [@"sjja123kadjkh213" numberCount]; // 计算数字个数类的本质也是对象,是一个class类型的对象,简称类对象
获取内存中了类对象
class c = [p class];
另一种获取内存中的类对象
class c1 = [Person class];
2.类的load方法
在类被加载的时候调用+load方法,不管你使用不使用,它都会加载。分类中也会加载这个方法
@implementation Person
+(void)load
{
NSLog(@"Person方法");
}
<pre name="code" class="objc">@end
3.类的initialize方法 当第一次使用这个类的时候,就会调用一次当前类的+initialize方法
+(void)initialize
{
NSLog(@"Person-initialize");
}
先加载父类再加载子类,先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)
4.description方法
默认情况下,利用NSLog和%@输出对象时,结果是<类名:内存地址>;但是我们不需要关心这个。
这种情况下,首先会调用P的-description方法的返回值(NSString *)显示到屏幕上。
所以要重写description方法
<pre name="code" class="objc">// 决定了类对象输出结果
- (NSString *)description{ return [NSString stringWithFormat:@"age=%d, name = %@", _age, _name];} 三.NSLog的输出补充 Person *p =[ [Person alloc] init];
// 指针变量的地址
NSLog(@"%p", &p);
// 对象地址
NSLog(@"%p", p);
// 类名+对象地址
NSLog(@"%@", p);
__LINE__ // 当前代码的行号。用%d输出
__FILE__ // 输出文件路径,用%s输出,使用printf("%s\n",__FILE__);
__func__ // 输出当前函数名,用%s输出,使用NSLog(@"%s\n",__func__);
四.SEL数据类型
一个sel类型就代表一个方法
// 先设置一个SEL类型的数据s保存(test1:)<pre name="code" class="objc">SEL s = @selector(test1:);
// 再调用test1方法,传入@“sun”
[p performSelector:s withObject:@"sun"];
- (void)test2
{ // 把cmd转成字符串,输出结果为test2
NSString *str = NSStringFromSelector(_cmd);
NSLog(@"调用了test1方法-%@",str);
}