02 OC面向对象基础

本篇是OC中关于类的一些最基础的细碎语法点


1. 类文件及引用

类文件

.h –> 类声明文件,声明变量和方法,所有在.h中声明的方法都是公共方法。
.m –> 类实现文件,实现方法。

//头文件.h中
@interface Teacher: NSObject // 基类不可以省略
{
    int age;
    NSString * name;
}
-(NSString*) name;
-(void) setName: (NSString *) newName;
@end


//实现文件.m中
#import "Teacher.h"
@implement Teacher
-(NSString *) name{
    return name;
}
-(void) setName: (NSString * )newName{
    name = newName; //此处是浅拷贝,根据情况自己去深拷贝
}
@end

使用import

解决include递归包含问题,相当于加了预处理判定指令的#include
同理:< >表示系统库, “”表示引用自身头文件

import < Foundation/Foundation.h >
import “myHeader.h”

2. 变量及方法语法简述

成员变量写在{}中
方法:
(1)归属:+代表类方法 -代表实例方法
(2)参数:有几个冒号就有几个参数
(3)调用:使用[ ] 进行方法调用

3. 成员变量作用域、访问方式

成员变量作用域

三种作用域:(因为没有包的概念,所有没有package的作用域)
@public
@protected—–>默认
@private

成员变量封装方法访问(getter/ setter)

基本写法:

@interface Teacher: NSObject
{
    @private int age;
}
-(int) age; // getter方法的命名,不要写成getAge
-(void) setAge: (int)newAge;

@end

@implement Teacher
-(int) age{
    return age;
}
-(void) setAge: (int)newAge{
    age = newAge;
}
@end

点语法访问

点语法编译器会将其翻译成get set 方法(不像Java中的点语法是直接访问变量),因此,如果不存在get set会报错

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Teacher * teacher = [[Teacher alloc] init];

        //访问 age
        [teacher age];
        int age = teacher.age;

        //set age
        [teacher setAge:8];
        teacher.age = 8;
    }
    return 0;
}

// 注意:点语法不是直接访问成员变量,为防止模糊,将成员变量在定义时前面加上下划线_,完整规范版get set方法写法

@interface Teacher: NSObject
{
    @private int _age;
}
-(int) age; // getter方法的命名,不要写成getAge
-(void) setAge: (int)age;
@end


@implement Teacher

-(int) age{
    return _age;
}

-(void) setAge: (int)age{
    _age = age;
}

@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Teacher * teacher = [[Teacher alloc] init];

        //访问 age
        [teacher age];
        int age = teacher.age;

        //set age
        [teacher setAge:8];
        teacher.age = 8;
    }
    return 0;
}

编译器升级: @property @synthesize

由于每个属性都写两个get 和 set方法,而且内容大致一样,重复冗余过多,编译器提供了两个关键字解决该问题 @property 以及 @synthesize

xcode4.5以下:

.h中:
@property int age; // @property会自动展开age属性get set的声明
.m中:
@synthesize age; //@synthesize会自动展开该property的实现
@synthesize age = _age; 

//注意:*** 展开时寻找属性的顺序:
// 先找显性赋值的属性(_age),如果该属性不存在,自动生成一个。
// 若未有显性赋值,则寻找同名属性(age),如果该属性不存在,自动生成一个。

xcode 4.5以上:

//不需要写@synthesize了,仅写@property即可
//***直接访问或者生成_age变量

4. 方法

构造方法

构造方法是动态方法:

-(id)initWithAge:(int)age{
    self = [super init]; //先调用super的init
    if(self){//判断是否为空
        _age = age;
    }
    return self;
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //alloc方法是类方法,负责开辟内存空间(程序要做的)
        //init方法是实例方法,负责初始化类的成员变量(我们要做的工作)
        Teacher * teacher = [[Teacher alloc] initWithAge:8];
        NSLog(@"Teacher's age is %i", teacher.age);

        // 等价写法 new关键字的使用
        [[Teacher alloc]init] == [Teacher new]
    }
    return 0;
}

对象描述方法

OC中类似于java中的toString方法,打印对象信息的函数:

NSObject中:

+(NSString*) description; //子类可以重写该方法

self指代

self 在静态方法中指代“类”,在动态方法中指代“对象”

//谁调用方法,就是指代谁
self.age
[self alloc]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值