oc基本用法

Student.h文件

#import <Foundation/Foundation.h>
/*  1.@interface 是接口文件,表示一个类的开始
    2.Student 是当前的类名
    3.NSObject 是集成的父类
    4.类到 @end 才结束
    5.文件名与类名没有关系,但是为了方便对文件里的类进行管理,所以让文件名和类名相同
    6.文件中可以写多个类,但是还是方便管理原则,一个文件中只写一个类
 */
@interface Student : NSObject        /*类包括特征和行为*/
//特征
{
@public
    //成员变量(实例变量)
    NSString *_stuName;    //姓名
    NSString * _stuSex;    //性别
    NSInteger _stuAge;     //年龄
    CGFloat _stuScore;     //成绩
    NSString *_stuHobby;   //爱好
}
//行为
-(void)sayHi;
-(void)eat;
-(void)play;
/*
 ******有关成员变量的可见度问题*********
 public protected private package
 1.@public 级别最低,都可以通过对象的 -> 方式找到,不安全
 2.@protected 不写public默认为它的下一个级别protected, 被保护的成员变量可以在当前类及其子类中使用
 3.@private: 私有的,只能在当前的类使用,使用范围更小
 4.@package:这个是系统的一些文件来使用,系统用,如果看见,直接跳过去
 */



//********最全的自定义初始化方法******************
//自定义初始化方法声明
-(id)initWithStuName:(NSString *)stuName
              StuSex:(NSString *)stuSex
              StuAge:(NSInteger)stuAge
            StuScore:(CGFloat)stuScore
            StuHobby:(NSString *)stuHobby;


//便利构造器
 /*
  1.是一个+方法
  2.便利构造器把创建对象的过程放到了程序的.m文件周昂,这样通过类,直接就能创造一个对象
  3.系统提供了很多便利构造器的方法
  */
/*方法一共可以分为两种:1.类方法+ 一般类来进行使用 比如alloc ;2.实例方法- 一般对象来调用 比如我们自己写的sayHi,init*/
+(Student *)StudentWithStuName:(NSString *)stuName
                        StuSex:(NSString *)stuSex
                        StuAge:(NSInteger)stuAge
                      StuScore:(CGFloat)stuScore
                      StuHobby:(NSString *)stuHobby;



//***********有关成员变量的赋值***********
//1.对所有成员变量的赋值语句
-(void)setStuName:(NSString *)stuName
        setStuSex:(NSString *)stuSex
        setStuAge:(NSInteger)stuAge
      setstuScore:(CGFloat)stuScore
      setStuHobby:(NSString *)stuHobby;

//2.设置器和访问器:针对一个成员变量进行值的存储和读取,当多个成员变量进行操作的时候,称之为赋值语句
//设置器
-(void)setStuname:(NSString *)stuName;
-(void)setStuSex:(NSString *)stuSex;
-(void)setStuAge:(NSInteger)stuAge;
-(void)setStuScore:(CGFloat)stuScore;
-(void)setstuHobby:(NSString *)stuHobby;
//访问器
-(NSString *)stuName;
-(NSString *)stuSex;
-(NSInteger)stuAge;
-(CGFloat)stuScore;
-(NSString *)stuHobby;

@end

Student.m文件

#import "Student.h"

@implementation Student
//行为的实现
-(void)sayHi{
    NSLog(@"%@, %@, %ld, %g, %@", _stuName, _stuSex, _stuAge, _stuScore, _stuHobby);
}
-(void)eat{
    NSLog(@"吃");
}
-(void)play{
    NSLog(@"玩");
}


//*********自定义初始化*************
-(id)initWithStuName:(NSString *)stuName
              StuSex:(NSString *)stuSex
              StuAge:(NSInteger)stuAge
            StuScore:(CGFloat)stuScore
            StuHobby:(NSString *)stuHobby{
    self = [super init]; //先调用父类的初始化方法,对父类继承过来的成员变量进行设置
    if (self) {
        _stuName = stuName;
        _stuSex =stuSex;
        _stuAge = stuAge;
        _stuScore = stuScore;
        _stuHobby = stuHobby;
    }
    return self;
}
//当这个对象在初始化的过程中出现问题,会返回一个空指针,如果是空指针,接下来的赋值就没有意义,跳过去;如果返回的是一个正常的堆空间地址,才能继续赋值
//有关空指针错误:
  /*
   C语言中如果针对一个空指针操作,比如赋值,系统运行到该句代码会马上崩溃,而在OC中遇到空指针会把这句代码当做废代码,会执行,但不会有任何效果
   */



//**********便利构造器************
+(Student *)StudentWithStuName:(NSString *)stuName
                        StuSex:(NSString *)stuSex
                        StuAge:(NSInteger)stuAge
                      StuScore:(CGFloat)stuScore
                      StuHobby:(NSString *)stuHobby{
    Student *student =[[Student alloc]initWithStuName:stuName StuSex:stuSex StuAge:stuAge StuScore:stuScore StuHobby:stuHobby];
    return student;

}

//********所有成员变量赋值***********
-(void)setStuName:(NSString *)stuName
        setStuSex:(NSString *)stuSex
        setStuAge:(NSInteger)stuAge
      setstuScore:(CGFloat)stuScore
       etStuHobby:(NSString *)stuHobby{
    _stuName = stuName;
    _stuSex = stuSex;
    _stuAge = stuAge;
    _stuScore =stuScore;
    _stuHobby =stuHobby;
}

//******设置器和访问器*********
-(void)setStuname:(NSString *)stuName{
    _stuName =stuName;
}
-(void)setStuSex:(NSString *)stuSex{
    _stuSex =stuSex;
}
-(void)setStuAge:(NSInteger)stuAge{
    _stuAge =stuAge;
}
-(void)setStuScore:(CGFloat)stuScore{
    _stuScore = stuScore;
}
-(void)setstuHobby:(NSString *)stuHobby{
    _stuHobby = stuHobby;
}
//访问器
-(NSString *)stuName{
    return _stuName;
}
-(NSString *)stuSex{
    return  _stuSex;
}
-(NSInteger)stuAge{
    return _stuAge;
}
-(CGFloat)stuScore{
    return _stuScore;
}
-(NSString *)stuHobby{
    return _stuHobby;
}

@end

main.m文件

#import <Foundation/Foundation.h>
#import"Student.h"
int main(int argc, const char * argv[])
{
//基本使用方法
   /*
    NSLog(@"鱼班长");

    NSInteger i = 100;   //整型
    NSLog(@"%ld", i);

    CGFloat f = 3.14;    //浮点型
    NSLog(@"%g", f);

    NSString *str = @"liushan山";   //字符串 OC中字符串可以使用中文
    NSLog(@"%@", str);

    NSArray *arr = @[@"1", @"2"];   //OC里的数组
    NSLog(@"%@", arr);

    for (NSInteger i = 0; i < 2; i++) {    //遍历数组
        NSLog(@"%@", arr[i]);
    }
    */



创建一个对象:
创建对象需要两步
1.需要给对象开辟空间, 开辟堆空间内存
2.对象内存开辟后,需要对对象进行初始化设置
    Student *stu = [Student alloc];
    stu = [stu init];

    //把两步合并到一起
    Student *stu = [[Student alloc]init];   //初始化空值
    [stu sayHi];   //通过对象来调用行为


   //操作成员变量:
    NSLog(@"%@", stu ->_stuHobby);  //对象通过 -> 来访问自己的成员变量
    stu -> _stuAge = 23;   //赋值

    stu -> _stuName = @"杨林";       //修改字符串可直接赋值
    NSLog(@"%@", stu ->_stuName);
    stu -> _stuName = @"刘珊珊";
    NSLog(@"%@",stu ->_stuName);




//自定义初始化:
    Student *stu = [[Student alloc]initWithStuName:@"yeting" StuSex:@"女" StuAge:26 StuScore:80.5 StuHobby:@"玩"];
    [stu sayHi];





 //**********便利构造器创建对象**************
    Student *stu = [Student StudentWithStuName:@"haha" StuSex:@"男" StuAge:28 StuScore:78 StuHobby:@"足球"];
    [stu sayHi];


//***********所有成员变量赋值***************
    Student *stu = [[Student alloc]init];
    [stu setStuName:@"yeting" setStuSex:@"女" setStuAge:26 setstuScore:98 setStuHobby:@"玩"];
    [stu sayHi];

****设置器和访问器
    [stu setstuHobby:@"玩"];
    NSLog(@"%@", [stu stuHobby]);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

属性

## Person.h文件 ##

#import <Foundation/Foundation.h>

@interface Person : NSObject


//属性
//属性一共做了3件事,
//1.声明了设置器setter和访问器getter
//2.实现了设置器和访问器
//3.声明了成员变量,成员变量命名会在属性名的前面加一个下划线
//具体的数据的存储,还是成员变量来完成,属性只不过帮助程序员完成了一些琐碎的工作,简化了代码
@property NSString *name;
-(void)sayHi;

//属性的属性
//第一类:读写控制:readonly, readwrite
//readonly设置之后,属性就没有setter方法,默认是readwrite
//setter和getter
//@property(readonly)NSString *hobby;
//setter和getter的作用是给设置器和访问器的方法重新写了一个名字,注意:设置器在名的设置的时候不要忘记了:
@property(setter = nihao:, getter = buhao)NSString *hobby;

//第二类: 原子性控制 默认初始值是atomic
//通过原子性atomic来监控事务在整个过程中有没有完成,但是一般来讲我们就是对数据的的简单赋值, 一般这部分我们用非原子性nonatomic
@property(atomic)NSString *sex;


//第三类:语义设置 有关内存管理,引用计数
//copy, assign, retain
//retain 一般是对象类型会用到,比如我们自己写的类,嗨哟NSArry会用
//assign一般是NSInteger,CGFloat会使用,因为他们在栈区,不需要内存管理,所以用assign
//copy一般只有字符串会使用copy
@property(nonatomic, copy)NSString *color;
@property(nonatomic , assign)NSInteger age;
@property(nonatomic, assign)CGFloat score;
@property(nonatomic, retain)NSArray *arr;

@end

## Person.m文件 ##

@implementation Person
//属性的实现
//关键词是@synthesize, 前面放属性名,后面放对应的成员变量
//在Xcode4.5之后才开始不写的,所以在之前的老的工程里,还有大量的@synthesize
//@synthesize name = _name;

-(void)sayHi{
    NSLog(@"%@", _name);
   }

@end

## main.m文件 ##

#import <Foundation/Foundation.h>
#import"Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
    Person *per = [[Person alloc]init];
    //对象通过设置器对成员变量内容进行修改
    [per setName:@"你好"];
    //对象昂通过访问器来进行取值
    NSLog(@"%@", [per name]);



    Person *per = [[Person alloc] init];
    [per nihao:@"1" ];
    [per buhao];


    Student *stu = [[Student alloc]init];
    [stu setStuName:@"鹰王"];  //getter
    NSLog(@"%@", [stu stuName]);
    //针对对象的属性,我们可以使用点的语法,来获取对象的内容,也可以进行设置
    stu.stuName = @"崔某";  //setter
    NSLog(@"%@",stu.stuName);
    //通过点语法,可以对属性进行操作,大量的节省了代码
    //离=号近的是setter方法,其余的都是getter方法



    //kvc
    //key - value - coding 键值对编码
    //把属性名看成shikvc中的key键,把要修改的值看成是value,然后通过kvc的方法,把值赋给指定的key
    [stu setValue:@"崔某" forKey:@"stuName"];
    NSLog(@"%@",stu.stuName);
    NSLog(@"%@", [stu valueForKey:@"stuName"]);

super:
是编译器指令,并非对象
给super发送消息,可以执行父类中实现的方法
例:
子类可以重写父类中的方法,如果子类有自己的重写的父类的方法的实现.还想要使用父类中的方法,可以向superfa发送消息

@class
避免循环嵌套导入头文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值