黑马程序员之ios学习总结——10 OC语言的构造方法和分类

构造方法:用来初始化对象的方法,是个对象方法,-开头。构造方法其实就是将对象初始化的方法。以前对象的初始化都用[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:
1.基本用途
如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式
继承
分类(Category)继承和分类有一些相似处,也有本质的区别。
2.格式
分类的声明
@interface 类名 (分类名称)
// 方法声明
@end
分类的实现
@implementation 类名 (分类名称)
// 方法实现
@end


分类名写在原来类的右边,并且用小括号括住,只要是小括号括住的类名,一定是分类,固定格式.

   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

 main .m文件

#import 
#import "NSString+Number.h"

int main()

{
    int count = [@"9fdsfds543543" numberCount];
    
    NSLog(@"%d", count);

    return 0;
}


3.好处
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作

4.分类的使用注意:
Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效




你可能感兴趣的:(黑马程序员之ios学习总结——10 OC语言的构造方法和分类)