OC中的类

OC中类

OC中类的定义

在Xcode中创建一个新的类,会自动给你生成两个文件一个是.h另外一个是.m文件,你新创建的类默认继承了NSObject类,因为有一些方法都需要基类中的方法。比如alloc分配内存
OC中用来描述类的使用@interface 类名:父类来进行定义然后用@end来定义类的结束

@interface NsFirst : NSObject{
    int _age;
    int _no;
}
- (void )setAge:(int)age;
-(int)getAge;
-(void) setNo:(int) no;
-(int) getNo;
@end

OC中类的实现

跟C++不同的一点,OC中的类的实现并不能和声明放在一起,否则编译会报错。而在C++中虽然强调要分开写,但写到同一个文件中也并不会出错,而在OC中就不是这样
OC中新开一个文件用来进行类的实现,用@implementation 类名开始进行实现,用@end对实现进行结束标记

@implementation NsFirst
-(void )setAge:(int)age{
    _age = age;
}
-(int)getAge{
    return _age;
}
-(void)setNo:(int)no{
    _no = no;
}
-(int)getNo{
    return _no;
}
@end

类的方法

对于每一个类都有静态方法(对于类的方法)和动态方法(对于对象的方法),C++中调用静态方法用的是类作用域运算符::去进行调用,对于动态方法通过->或者.两个运算法来进行调用
而在OC中调用相应的方法都是通过消息发送,也就是[]这个运算符

//对于上面的类进行相应方法调用
id ns = [[NsFirst alloc] init];
[ns setAge:100];
NSLog(@"age is %i",[ns getAge]);

自定义构造方法

一般我们使用的init方法是编译器默认的一种动态方法,会给对象初始化为0,而有些时候我们需要初始化后进行赋值,所以此时就需要重写init方法
重写init方法

  1. 自己写的init方法名称不能与系统一样
  2. init方法的步骤
    1. 先调用基类构造
    2. 判断是否对象是否创建成功,成功后进行赋值操作
    3. 返回当前对象self
@interface Student : NSObject
@property int age;
@property int no;
//自己写一个构造方法
-(id)initWithAge:(int)age :(int)no;
@end

@implementation Student
-(id)initWithAge:(int)age :(int)no{
    //首先调用super的init的方法 
    //判断是否初始化成功
    if(self = [super init]){
        //赋值
        self.age = age;
        self.no = no;
    }   
    //返回
    return self;
}
@end

打印对象信息时的description方法

关于多文件编译

OC中可以有多个.h和.m文件,但入口函数都是main函数,而且OC中没有命名空间,所以两个文件中的类名是可能重名的,所以我们尽可能命名使类名不能出现重名的情况。

点语法

C++中如果定义了对象,可以通过对象名.的方式对对象中属性进行操作,在OC中也提供了这种类似的方式
OC中的点语法要去使用的话,必须要有相应的set方法且set方法设置的属性必须与点语法后的属性名匹配

@interface Person : NSObject{
    int _age;
    int _no;
}
//-(void)setAge:(int)age:(int)no;
-(void )setAge:(int)age;
-(void )setNo:(int)No;
-(int)getAge;
-(int)getNo;
@end

#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        Person* p = [[Person alloc] init];
        p.age = 10;  //这里就相当于调用setAge方法,但注意setAge方法只能对age这一个属性进行操作
        p.no = 20;
//        [p setAge:10 :20];
        int age = [p getAge];
        int no = [p getNo];
        NSLog(@"age is %i and no is %i",age,no);
        
    }
    return 0;
}

@propety

在写OC中如果给每个属性都写上get和set方法,显得代码太过于冗余,可以使用@propety来定义成员变量,这样编译器就可以自动为我们进行set方法和get方法的声明

  1. @propety = 声明set和get方法
  2. @synthesize = 实现set和get方法
@interface Property : NSObject{
    int age;
    int no;
    float height;
}
@property int age;
//-(void) setage:(int)newAge;
//-(int)age;
@property int  no;
@property float height;
@end

@implementation Property

@synthesize age;
@synthesize height;
@synthesize no;
@end

如果在有很多的成员变量例如如下情况

@interface Property : NSObject{
    int age;
    int age1;
    int age2;
}

那么使用@propety默认声明与其同名的成员变量的set和get方法
使用@propety声明变量后编译器自动帮助我们声明成员变量,我们就不用再手动声明变量。自动生成的变量为私有的.
@synthesize 实现的成员变量如果没有显示定义,则会隐式创建一个与其名称相同的变量,若是想要其生成的方法是我显示定义的方法,则需指定实现具体的哪个变量

@synthesize age = _age

目前版本中,一但使用@propety声明了变量,编译器会自动帮助我们生成@synthesize,自动帮我们实现
如果我们觉的编译器帮助我们生成的方法并不符合我们的预期,那么我们可以自己实现相应的get方法和set方法,编译器就不会再帮我们实现了,如果我们只想要get或者set两者中的任意一个的话,我们只需要实现其中的任意一个就行,另外一个编译器依旧会帮助我们实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值