设为首页 加入收藏

TOP

Snail―OC学习之类及对象(一)
2015-07-24 04:47:01 来源: 作者: 【 】 浏览:289
Tags:Snail 学习 之类 对象

对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型

面向对象的编程语言都是有类及对象的

类是由属性及方法组成。

OC中的所有官方类及自定义的类都是NSObject的直接或者间接子类

下面看看类的编写规范

首先,COMMAND+N 新建一个类 Dog类

看到会生成两个文件.h和.m

.h是对属性及方法的声明,.m是对方法实现.

Dog.h文件中编写如下

?

#import 
  
   

@interface Dog : NSObject{
    //名字的变量 类型是字符串
    NSString *_name;
    //性别暂时用int值代替 1代表公 0代表母
    int _sex;
    
}


// 前面是+号,即此函数是Dog类的方法 可以直接用Dog类名来调用
// 无需创建对象就可以调用,简化代码
//另一个作用就是用来创建单例,即在整个生命周期,无论创建多少次都是同一个对象
+ (instancetype)sharedDog;

// 前面是-号的叫做对象方法
//默认的无参构造函数  如果不写 也是会存在的默认构造函数
- (instancetype)init;
//带一个参数的构造函数
- (instancetype)initWithName:(NSString *)name;
//带两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex;


//对象变量name、sex的get及set方法
- (void)setName:(NSString *)name;
- (NSString *)name;
- (void)setSex:(int)sex;
- (int)sex;


// 狗的一个行为
// bark(叫) 返回值为void空,无参
- (void)bark;

//lookHome(看家)无参
- (void)lookHome;

@end

  

Dog.m代码编写如下

?

?

#import Dog.h

@implementation Dog


// 由此可见,利用Dog类名来调用这个方法时 无论创建多少次对象都是同一个dog
+ (instancetype)sharedDog{
    static Dog * dog;
    if (dog != nil) {
        dog = [[Dog alloc] init];
    }
    return dog;
}

//init开头的方法都是初始化构造函数 一种编码规范
// init是没有参数的默认写法
- (instancetype)init{
    if (self = [super init]) {
    }
    return self;
}

//这是具有一个参数的初始化构造函数
- (instancetype)initWithName:(NSString *)name{
    if (self = [super init]) {
        _name = name;
    }
    return self;
}

//具有两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex{
    if (self = [super init]) {
        _name = name;
        _sex = sex;
    }
    return self;
}


- (void)setName:(NSString *)name{
    _name = name;
}

- (void)setSex:(int)sex{
    _sex = sex;
}

- (int)sex{
    return _sex;
}

- (NSString *)name{
    return _name;
}

//叫得方法 实现
- (void)bark{
    //在类的方法中可以访问成员变量,也可以赋值
    _name = @刀刀;
    NSLog(@%@在叫!,_name);
}

- (void)lookHome{
    _sex = 1;
    NSLog(@刀刀狗是个%d的,_sex);
}


@end
main函数引入头文件后创建几个对象

?

?

#import 
  
   
#import Dog.h

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Dog * dog1 = [Dog sharedDog];
        [dog1 setName:@刀刀];
        [dog1 setSex:1];
        //%p可以打印出对象的地址 0x100106800
        NSLog(@%p,dog1);
        Dog * dog2 = [Dog sharedDog];
        //0x100106800  dog2的地址和dog1的地址一样 即是同一个对象
        NSLog(@%p,dog2);
        
        //当我们在main函数即相对于Dog类来说的外界函数 我们无法调用self.name的 我们通过set/get来对变量进行赋值或者获取

        // alloc 是在堆空间开辟一块空间 然后init初始化对象
        Dog * dog3 = [[Dog alloc] init];
        //下面赋值可以这样写 dog3.name = @汪星人;
        //原理就是此语句调用的下面这个方法 调用了 -(void)setName:(NSString *)name;
        [dog3 setName:@汪星人];
        //下面dog3.name 的作用跟 [dog name]一样
        //其实前者这样写的原理就是调用了后者 调用了(NSString *)name方法
        NSString * name = dog3.name;
        NSLog(@%@,name);
        //dog3调用直接的bark(叫)的方法
        [dog3 bark];
        
        //有参的初始化方法
        Dog * dog4 = [[Dog alloc] initWithName:@大黄 AndSex:8];
        NSLog(@我是%@,dog4.name);
        
        
    }
    return 0;
}

  

下面,来介绍一个知识点,即property属性修饰

?

改写一下Dog类

首先,Dog.h中 改写成下面这样

?

#import 
  
   

@interface Dog : NSObject{
    
}

@property NSString * name;
@property int sex;


// 前面是+号,即此函数是Dog类的方法 可以直接用Dog类名来调用
// 无需创建对象就可以调用,简化代码
//另一个作用就是用来创建单例,即在整个生命周期,无论创建多少次都是同一个对象
+ (instancetype)sharedDog;

// 前面是-号的叫做对象方法
//默认的无参构造函数  如果不写 也是会存在的默认构造函数
- (instancetype)init;
//带一个参数的构造函数
- (instancetype)initWithName:(NSString *)name;
//带两个参数的构造函数
- (instancetype)initWithName:(NSString *)name AndSex:
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言取整方法总结 下一篇objective-c中的category

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: