当先锋百科网

首页 1 2 3 4 5 6 7


一.构造方法

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;
}

 精简版的重写init方法 

- (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"];

 

每个方法内部都有一个_cmd,它代表当前方法。只能转成字符串调用

- (void)test2
{   // 把cmd转成字符串,输出结果为test2
    NSString *str = NSStringFromSelector(_cmd);
    NSLog(@"调用了test1方法-%@",str);
}