OC 基础知识2

//实例变量可见度分为三种

/**

 *  1@public 公开的,实例变量既可以在类的外部 也可以在类的内部进行访问。简单的说,就是任何文件中都能访问,所以实例变量的安全性就会变得非常低,不建议采用,违背了OC中封装的特性。

    2@protected 受保护的,实例变量只能在本类以及子类中进行访问,是实例变量的默认可见度,也是我们以后用的可见度。

    3@private 私有的,实例变量只能在类的内部进行访问。不对外公开。

 */


//给实例变量赋值的方法

//此方法的功能 是为_name 实例变量赋值,因此参数类型 应该与 实例变量_name类型一致,为NSString *类型。

//因为仅仅是赋值操作,所以,不需要有返回值,所以返回值类型为void

//因为设置实例变量是每个对象的功能,并且类方法中不能访问实例变量,所以此方法是实例方法,- 方法。

//方法名的写法与函数名是一样的,第一个单词小写,剩下的单词首字母大写,采用驼峰法。

//实例变量的setter方法,书写格式 - (void)setXxxx:(实例变量类型)xxxx.

//其中Xxxx为实例变量名去掉下划线。

- (void)setName:(NSString *)name;


//获取实例变量值的方法

//因为是获取值,所以有返回值,返回值类型与你获取的实例变量类型一致。

//因为是获取值,所以不需要有参数。

//因为取值是每个对象的功能,并且类方法内部也不可以访问实例变量,所以此方法为对象方法,- 方法。


//自定义初始化方法

//什么时候需要定义一个初始化方法?

//1、父类里面的初始化方法无法满足 初始赋值 的需求。比如NSObject类里面有一个init方法,但是这个方法做了一个空操作,不能为我们的实例变量进行赋值。

//2、重写父类的初始化方法init 只能给实例变量设置固定值,不够灵活。

//3、当我们要给某些实例变量赋初始值,但是当前没有这样的初始化方法时,就需要我们自己定义初始化方法,完成需求。

//4、一个类可以有多个初始化方法,初始化方法也是方法,可以没有参数也可以有多个参数。


/**

 *  注意:初始化方法的特点

    1、初始化方法是 实例方法 -

    2、初始化方法的返回值是id 或者 instancetypeidinstancetype是一个意思,都表示泛型(对象类型)。只不过在iOS7之前使用idiOS7之后使用instancetypeinstancetype更加见名知义

    3、初始化方法以init开头。可以无参数 也可以有多个参数,根据需求来定

    4、初始化方法只会执行一次,因为初始化方法都会与alloc连用,而只要执行了alloc方法,就相当于在堆区域重新开辟一个空间来存储对象,所以对象不一样了。


    把重复的代码写到一个方法内部,然后去接收这个方法消息。

    //在类的内部,接收其他的消息方法,使用self

   // self就代表外界创建好的实例对象。

//@class的作用:告诉编译器 从这一行开始,Student1 只是一个类名。把之后出现的 Student1当作类名看待即可。

//能有效的避免循环导入头文件。

//Student1里面有什么实例变量,有什么方法 完全不知道,只知道Student1是一个类。

//如果 真的需要循环导入头文件的话,.h文件中通过@class标识类名之后,在.m文件中还是需要#import将类中的内容导入过来的。


//便利构造器,封装了alloc、初始化方法,代码更加简洁

//类方法,执行方法的为类名,得到的是当前类的实例,便利构造器方法名以类名开头。


//如果子类重写了父类的某个方法,应该在子类的.h中声明出来 重写的方法。这样别人就会知道这个方法是重写父类的。


- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender school:(NSString *)school number:(NSString *)number {

    //初始化继承过来的实例变量

//    [self setName:name];

//    [self setAge:age];

//    [self setGender:gender];

    

    //完整的初始化方法

    //1、先将从父类中继承过来的实例变量进行初始化赋值,想super发送父类中的初始化方法。

    self = [super initWithName:name age:age gender:gender];

    //2、将本类中独有的实例变量进行初始化赋值,完成对所有实例变量的初始化赋值

    if (self) {

        //初始化自身的实例变量

        [self setSchool:school];

        [self setNumber:number];

    }

    

    

    return self;

}


- (void)sayHi {

    NSLog(@"你好啊");

    

    [self setNumber:@"741"];//执行本类的方法使用self关键字。向谁发送消息,谁接到到消息,并且执行了方法,谁就是self

    //如果说一个子类重写了父类的某个方法A,那么在子类中,关于A方法就有两套实现,一个重写之前的,一个是重写之后的。

    //如果说 想要执行重写之前的A方法 也就是父类中的A方法,有两种途径:

    /**

     *  1、在子类中,使用super关键字,执行A方法,super并不是对象,而是编译器指令,发送消息给super,执行的是父类中的方法,并不是父类对象去执行方法。

        2、不重写A方法。

     */

    [super sayHi];//此时sayHi方法执行的就是 父类中的sayHi方法。

    //[self sayHi];//这是极其错误的写法,出现了致命的递归。

    

    //super除了可以执行重写之前的方法,还可以去执行父类的其他方法。只要是父类继承过来的方法,无论是否重写过,都可以通过super这个关键字执行。如果没有重写方法,那么此时通过superself执行的方法都是父类中的,因为子类找不到方法的实现,会往上查找父类是否有实现。

    [super eat];

}


    

    

#pragma mark -----创建字符串对象的方法-----

    

    /*

    //涉及到的内存区为栈区和常量区

    NSString *str = @"xxx";

    

    //1

    NSString *str1 = [[NSString alloc] initWithFormat:@"xxx"];

    

    //2

    NSString *str2 = [[NSString alloc] initWithFormat:@"name is %@, age is %d",str, 18];

    NSLog(@"%@",str2);

    

    //字符串的便利构造器

    NSString *str3 = [NSString stringWithFormat:@"juju is beautiful"];

    */

    

    

#pragma mark -----字符串功能方法----

    

    /*

    //1、获取字符串的长度

    NSString *str = [[NSString alloc] initWithFormat:@"name is %@",@"ffff"];

    //length 字符串类的一个属性,默认的getter方法名称是 length,所以对象执行length,就可以获取字符串长度。

    NSUInteger strLength = [str length];

    NSLog(@"%lu",strLength);

    

    //2、截取字符串

    //(1)、从第一个字符开始截取到指定字符。

    NSString *resultStr = [str substringToIndex:5];

    NSLog(@"%@",resultStr);

    

    //(2)、从某个字符开始截取到最后一个字符

    NSString *resultStr1 = [str substringFromIndex:5];

    NSLog(@"%@",resultStr1);

    

    //(3)、截取中间某一段字符串

    //第一种 取范围的方法 NSMakeRange(下标, 长度)可以获取某个范围。

    NSString *resultStr2 = [str substringWithRange:NSMakeRange(5, 2)];

    NSLog(@"%@",resultStr2);

    

    //第二种,先创建一个NSRange的结构体变量,当作参数传进去

    NSRange range = {5, 2};

    NSString *resultStr3 = [str substringWithRange:range];

    NSLog(@"%@",resultStr3);

    

    //3、拼接字符串

    NSString *newStr = [str stringByAppendingString:@"girl"];

    NSLog(@"%@",newStr);

    

    NSString *newStr1 = [str stringByAppendingFormat:@"%@",@"girl"];

    NSLog(@"%@",newStr1);

    

    //4、替换字符串

    NSString *replaceStr = [str stringByReplacingOccurrencesOfString:@"ffffff" withString:@"2222222"];

    NSLog(@"%@",replaceStr);

    

    //5、判断两个字符串是否相等

    NSString *sourceStr1 = @"def";

    NSString *sourceStr2 = [[NSString alloc] initWithFormat:@"abc"];

    BOOL isEqual = [sourceStr1 isEqualToString:sourceStr2];

    NSLog(@"%d",isEqual);

    */

    

    //6、字符串比较

    /**

     *  1、升序NSOrderedAscending -1 前面的字符串小于后面的字符串

        2、降序NSOrderedDescending 1 前面的字符串大于后面的字符串

        3、相等NSOrderedSame 0 前面的字符串与后面的字符串相等

     */

    /*

    NSComparisonResult compareResult = [sourceStr1 compare:sourceStr2];

    NSLog(@"%ld",compareResult);

    

    //7、判断是否以某个字符串开始,判断是否以某个字符串结尾

    //name is 菊菊

    BOOL isPre = [str hasPrefix:@"name"];

    NSLog(@"%d",isPre);

    

    BOOL isSuf = [str hasSuffix:@"菊菊"];

    NSLog(@"%d",isSuf);

*/

    

    /**

     给定一个图片文件名,判断字符串中是否以“png”结尾,如果是就替换成“jpg”,如果不是,就拼接”.jpg”

    */

//    NSString *picture = [[NSString alloc] initWithFormat:@"juju.png"];

//    if ([picture hasSuffix:@"png"]) {

//        NSString *str = [picture stringByReplacingOccurrencesOfString:@"png" withString:@"jpg"];

//    }else {

//        NSString *str = [picture stringByAppendingString:@"jpg"];

//    }

    

    /*

    NSString *str1 = [[NSString alloc] initWithFormat:@"name is 菊菊 boy"];

    

    //按照某个字符串进行分割,得到多个字符串。

    NSArray *array = [str1 componentsSeparatedByString:@" "];

    NSLog(@"%@",array);

    */

    

    

#pragma mark -----可变字符串-----

    

    /*

    //创建一个可变字符串对象

    NSMutableString *mStr = [[NSMutableString alloc] initWithCapacity:0];//一般给0,是动态分配内存大小的。

    

    //设置字符串

    [mStr setString:@"name is juju"];

    NSLog(@"%@",mStr);

    

    //拼接字符串

    [mStr appendString:@"girl"];

    NSLog(@"%@",mStr);

    

    //替换字符串

    [mStr replaceCharactersInRange:NSMakeRange(5, 2) withString:@"isNot"];

    NSLog(@"%@",mStr);

    

    //删除某段字符串

    [mStr deleteCharactersInRange:NSMakeRange(5, 5)];

    NSLog(@"%@",mStr);

    */

    

    

#pragma mark -----数组-----

    

    //创建一个不可变数组对象

    //nil不是对象,作用是:标记数组的赋值结束。

    NSArray *array = [NSArray arrayWithObjects:@"name", @"is", @"juju", nil];

    

    //获取数组元素个数

    NSUInteger count = [array count];

    NSLog(@"%lu",count);

    

    //获取数组中的元素,也就是保存的对象

    NSString *str = [array objectAtIndex:0];

    NSLog(@"%@",str);

    NSLog(@"%@",array[1]);

    NSLog(@"%@",[array lastObject]);

    

    //遍历数组的方法

    for (int i = 0; i < [array count]; i ++) {

        NSLog(@"%@",[array objectAtIndex:i]);

    }

    

//    [array objectAtIndex:0] = @"gend";

    

    //创建一个可变数组对象

    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"name", @"is", @"juju", nil];

    

    NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:0];

    

    //添加元素,addObject,添加的元素(对象)在数组最后面

    [mArray addObject:@"girl"];

    

    //插入元素

    [mArray insertObject:@"gender" atIndex:1];

    

    //删除元素

    [mArray removeObjectAtIndex:2];

    

    //交换两个下标上的元素

    [mArray exchangeObjectAtIndex:0 withObjectAtIndex:2];

    

    NSLog(@"%@",mArray);//直接打印可以

    

    for (int i = 0; i < [mArray count]; i ++) {

        NSLog(@"%@",[mArray objectAtIndex:i]);

    }//遍历也可以

    

    //将一个数值转换成一个 对象,对象采用字符串

    NSInteger a = 10;

    

    NSString *str1 = [[NSString alloc] initWithFormat:@"%ld",a];

    

    [mArray addObject:str1];

    

    //值对象NSNumber

    int x = 100;

    NSNumber *number = [NSNumber numberWithInt:x];

    [mArray addObject:number];

    

    //将对象类型转换成基本数据类型

    NSLog(@"%ld",[[mArray objectAtIndex:4] integerValue]);

    NSLog(@"%d",[[mArray objectAtIndex:5] intValue]);

    

    //数值不能直接存入数组,因为数组中存储的元素必须是对象

    //将一个数值存入数组采用 numberWithxxx方法,根据你数值的类型决定方法名

    //从数组中取出对象之后,采用xxxValue可以将对象转换成我们最初的数值,参与运算。

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值