OC中类属性的封装方法和类的初始化

<1>OC中用get和set方法设置的属性获取与设置方法可以通过点语法来调用,调用格式为:

对象.对象变量

比如声明一个类Person

@interface Person:NSObject

{

int  _age;

-(void)setAge:int age;//age属性的设置

-(int)age;//age属性的获取

@end

Person *p = [Person new];

p.age = 18;//调用setAge方法

NSLog(@“age = %d”,p.age);//调用age方法;

只有在类中声明了属性的get和set方法后,才可以使用对象的点语法。点语法调用属性的set还是get方法取决于点语法所在的具体位置,当获取时采用get方法,设置时采用set方法;

<2>通过@property关键字可以简洁的声明OC类中定义的属性。比如(1)中age属性的

声明可以采用下面的形式:

@interface Person:NSObject

@property int age;//相当于声明setAge和age方法。

@end

<3>@synthesize关键字OC中用来在类实现的.m文件中实现set和get方法。如(2)中,在.h中声明了age属性后,在.m文件中实现的方式为@ synthesize age。

通过@property和@synthesize关键字声明和实现的属性是类中的私有变量,在子类中不能继承。

可以通过@synthesize关键字指定在.h文件中定义的属性,如(1)中声明的_age属性可以在

.m文件中通过@synthesize age = _age语句指定_age变量,这样就相当于声明并实现了类_age属性的set和get方法;

在Xcode4.4之后,可以通过@property的增强方法省去.m文件中的@synthesize语句。比如:

@interface

@property int age;//相当于声明了_age属性并在.m文件中实现了@synthesize;

@end

在@property增强方法下可以重写get或者set方法,但是不能同时重写get和set方法。

<3>OC中当直到程序执行时才能确定的类型称为动态类型;当定义为特定类型的对象时称为静态

类型。

<4>OC中id类型表示通用类型,可以指向任何类的对象,被称为“万能指针”。由于NSObeject

类型是所有类型的父类,因此NSObject类型也可以指向所有对象,但是当调用方法时使用NSObject类型定义的对象会进行编译器的检查,而id类型定义的对象则不会。

OC中的instancetype类型也可以表示所有的对象,和id类型类似。

<4>由于OC中多态的存在,因此在调用父类和子类中的方法时常常需要类型的转换,为了避免

忘记类型转换的错误,可以通过OC中动态类型检测的方法。

-(BOOL)isKindOfClass:class obj;//对象是否是obj类或者其派生类,若是返回YES,否则返回NO

-(BOOL)isMemberOfClass:class obj;//对象是否是obj类,若是返回YES,否则返回NO

+(BOOL)isSubclassOfClass:class obj;//类是否是obj类的子类

也可以在调用方法前判断对象能否响指定方法

-(BOOL)respondsToSelector:SEL//对象能否调用某方法

其中:SEL类型是方法的标示,可以通过手动的方法把C语言中的方法封装成SEL类型。比如:

SEL si = @selector(run);//把run方法封装成SEL类型;

+(BOOL)InstancesRespondToSelector:SEL//类中有没有指定的SEL方法

<5>当通过respondsToSelector和InstancesRespondToSelector方法判断对象或者类可以响应某

方法后,可以应用响应方法的语句:

-(id)performSelector:SEL//响应SEL方法

-(id)performSelector:  withObject: 响应带有参数的方法;

<6>OC中定义类对象时,类中初始化的方法称为类的构造方法,方法名是“init”,格式如下:

-(intstancetype)init;

当需要对类对象进行特定处理时,可以重写构造方法,其实现格式:

-(instancetype)init{

self = [super init];//防止父类初始化方法释放掉self指向的空间后申请新空间,造成self指向的

//空间地址不明确;

if(self){ 对类处理的语句};

return self;

}

还可以自定义构造方法:

-(instancetype)initWith:(形参类型) 参数名 and:(形参类型)参数名{

~~~~~~//类处理方法

}

使用自定义构造方法实例化对象时,需要用alloc函数声明。

以上知识点的实例如下:

#import <Foundation/Foundation.h>

@interface Person : NSObject
//定义属性
{
    int _age;
    NSString *_name;
}
//声明属性方法
-(void)setAge:(int)age;
-(int)age;
-(void)setName:(NSString *)name;
-(NSString *)name;
@end
#import <Foundation/Foundation.h>

@interface Person : NSObject
//定义属性
{
    int _age;
    NSString *_name;
}
//声明属性方法
-(void)setAge:(int)age;
-(int)age;
-(void)setName:(NSString *)name;
-(NSString *)name;
@end
#import <Foundation/Foundation.h>
#include "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];//定义对象
        p.age = 25;//调用set方法
        p.name = @"朱开山";
        NSLog(@"age = %d, name = %@",p.age,p.name);//调用get方法
    }
    return 0;
}
#import <Foundation/Foundation.h>

@interface Person : NSObject
//@property int age;
-(void)test;
@end
#import "Person.h"

@implementation Person
@synthesize age;
-(void)test{

}
@end
#import <Foundation/Foundation.h>
#include "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];//定义对象
        p.age = 25;//调用set方法
        //p.name = @"朱开山";
        NSLog(@"age = %d",p.age);//调用get方法
    }
    return 0;
}
#import <Foundation/Foundation.h>

@interface Animal : NSObject
-(void)eat;
@end
#import "Animal.h"

@implementation Animal
-(void)eat{
    NSLog(@"动物再吃!");
}
@end
#import "Animal.h"

@interface Dog : Animal
-(void)run;
@end
#import "Dog.h"

@implementation Dog
-(void)run{
    NSLog(@"狗在跑!");
}
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
      
        Animal *ani = [Dog new];//利用多态创建对象
        SEL si = @selector(run);//
        if ([ani respondsToSelector:si]) {
            //[(Dog *)ani run];
            [ani performSelector:si];
        }
        else
        {
            NSLog(@"方法不能调用");
        }
    }
    return 0;
}
#import <Foundation/Foundation.h>

@interface Gun : NSObject
@property int bulleteCount;
-(void)shoot;
@end
#import "Gun.h"

@implementation Gun
-(void)shoot{
    _bulleteCount--;
    NSLog(@"枪在射击!剩余子弹%d",_bulleteCount);
}
@end
#import <Foundation/Foundation.h>
#import "Solider.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Solider *s1 = [Solider new];
        [s1 shootByGun];
    }
    return 0;
}
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property NSString *name;
@property int age;
-(instancetype)initWith:(NSString *)name andAge:(int) age;
@end
#import "Person.h"

@implementation Person
-(instancetype)initWith:(NSString *)name andAge:(int) age;
{
    if (self = [super init]) {
        _name = name;
        self.age = age;
    }
    return self;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Student : Person
{
    int _score;
}
@property int sno;
-(instancetype)initWith:(NSString *)name andAge:(int) age andSno:(int) sno;
@end
#import "Student.h"

@implementation Student
-(instancetype)initWith:(NSString *)name andAge:(int) age andSno:(int) sno{
    self = [super initWith:name andAge:age];
    if (self) {
        _sno = sno;
    }
    return self;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *stu = [[Student alloc] initWith:@"周华健" andAge:50 andSno:01];
        NSLog(@"name = %@,age = %d,sno = %d",stu.name,stu.age,stu.sno);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值