OC语言构造方法:
用来初始化对象的方法,对象方法,以减号开头
为了让对象创建出来,成员变量就会有一些固定的值
重写构造方法的注意点:
先调用父类的构造方法([super init])
再进行子类内部成员变量的初始化
构造方法的调用:
完整的创建一个可用的对象:Person *p=[Person new];
New方法的内部会分别调用两个方法来完成2件事情,
1)使用alloc方法来分配存储空间(返回分配的对象);
2)使用init方法来对对象进行初始化。
可以把new方法拆开如下:
1.调用类方法+alloc分配存储空间,返回未经初始化的对象
Person *p1=[person alloc];
2.调用对象方法-init进行初始化,返回对象本身
Person *p2=[p1 init];
3.以上两个过程整合为一句:
Person *p=[[Person alloc] init];
说明:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。默认初始化完毕后,所有成员变量的值都为0。
例如:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end
#import "Person.h"
@implementation Person
// 重写-init方法
//- (id)init
//{
// // 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
// self = [super init]; // 当前对象 self
//
//
// // 2.如果对象初始化成功,才有必要进行接下来的初始化
// if (self != nil)
// { // 初始化成功
// _age = 10;
// }
//
// // 3.返回一个已经初始化完毕的对象
// return self;
//}
- (id)init
{
if ( self = [super init] )
{ // 初始化成功
_age = 10;
}
// 3.返回一个已经初始化完毕的对象
return self;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
// 构造方法:用来初始化对象的方法,是个对象方法,-开头
// 重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值
/*
重写构造方法的注意点
1.先调用父类的构造方法([super init])
2.再进行子类内部成员变量的初始化
*/
int main()
{
// Person *p = [Person new];
/*
完整地创建一个可用的对象
1.分配存储空间 +alloc
2.初始化 -init
*/
// 1.调用+alloc分配存储空间
// Person *p1 = [Person alloc];
// 2.调用-init进行初始化
// Person *p2 = [p1 init];
// // 调用-init进行初始化
// Person *p3 = [Person new];
//
//
// // 每个Person对象创建出来,他的_age都是10
//
Person *p4 = [[Person alloc] init];
Student *stu = [[Student alloc] init];
NSLog(@"------");
return 0;
}
构造方法使用注意
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的,再初始化子类的。
(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(4)注意点:
1、先调用父类的构造方法[super init];
2、再进行子类内部成员变量的初始化。
自定义构造方法:
自定义构造方法的规范:
(1)一定是对象方法,以减号开头
(2)返回值一般是id类型
(3)方法名一般以initWith开头
自定义构造方法例子:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *name;
@property int age;
/*
自定义构造方法的规范
1.一定是对象方法,一定以 - 开头
2.返回值一般是id类型
3.方法名一般以initWith开头
*/
- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age;
// initWithName:andAge:
- (id)initWithName:(NSString *)name andAge:(int)age;
@end
Person.m
#import "Person.h"
@implementation Person
- (id)init
{
if ( self = [super init] )
{
_name = @"Jack";
}
return self;
}
- (id)initWithName:(NSString *)name
{
if ( self = [super init] )
{
_name = name;
}
return self;
}
- (id)initWithAge:(int)age
{
if ( self = [super init] )
{
_age = age;
}
return self;
}
- (id)initWithName:(NSString *)name andAge:(int)age
{
if ( self = [super init] )
{
_name = name;
_age = age;
}
return self;
}
@end
对应的main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 andNo:10];
NSLog(@"00000");
}
return 0;
}
自定义构造方法的使用注意:
(1)自己做自己的事情
(2)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
成员变量的作用域:
@public
在任何地方都能直接访问对象的成员变量
@private
只能在当前类的对象方法中访问
@protected(可以不写,默认)
能在当前类和子类的对象方法中直接访问
@package
只要处在同一个框架中,就能直接访问对象的成员变量
@interface和@implementation中不能声明同名的成员变量
在@implementation中声明变量,默认是@private的