Foundation => Objective-C _ Part2

1. 初始化结构体属性

  • 初始化
typedef struct{
    int year;
    int month;
    int day;
}Date;
  • 强制转换
stu ->_birthday = (Date){1980,1,12};
  • 定义一个新的结构体, 给新结构体赋值, 再把新结构赋值给目标结构体
Date d = {1981,1,12};
stu->_birthday = d;
  • 分别赋值
stu->_birthday.year = 1981;
stu->_birthday.month = 1;
stu->_birthday.day = 12;
  • 注意
Date d1 = {1999,1,19};
Date d2;
d2 = d1 
这么写的本质, 是将d1所有的属性的值都拷贝了一份, 赋值给d2

2. 匿名对象

  • 匿名就是没有名字, 匿名对象就是没有名字的对象
  • 有名字的对象
    只要用一个指针保存了某个对象的地址,我们就可以称这个指针为某个对象
    例如: p是Person对象
    Person *p = [Person new]
    p->_age = 30;
    p->_name = @"henry";
    [p say];
  • 没有名字的对象
    无论有没有名字, 只要调用new方法都会返回对象的地址
    每次new都会开辟一块存储空间
    [Person new]->_age = 30;
    [Person new]->_name = @"peter";
    [[Person new]say];
  • 匿名对象的应用场景
    • 当对象只需要使用一次的时候, 就可以使用匿名对象
 Iphone *phone = [Iphone new];
 [phone brand];
 [[Iphone new]brand];
  • 匿名对象可以作为方法的参数(实参)
 Person *p1 = [Person new];
 [p1 signal:[Iphone new]];

3. 修改项目模板

  1. 模版信息
    /*
        工程名称
        文件名称
        创建者
        创建时间
        版权
        修改人
        修改时间
    */
  1. 修改项目模版以及main函数中的内容
    • /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Mac/Application/Command Line Tool.xctemplate/
  2. 修改OC文件头部的描述信息
    • /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/Source/Cocoa Class.xctemplate

4. Xcode文档安装位置

  1. Xcode文档安装的位置一:
    • /Applications/Xcode.app/Contents/Developer/Documentation/DocSets
    • 注意: 拷贝之前最好将默认的文档删除, 因为如果同时存在高版本和低版本的文档, 那么低版本的不会显示
  2. Xcode文档安装的位置二:
    • /Users/你的用户名/Library/Developer/Shared/Documentation/DocSets
    • 如果没有该文件夹可以自己创建一个

5. 封装的基本概念

  1. 概念: 屏蔽内部实现的细节, 仅对外提供共有的方法/接口
  2. 好处: 保证数据的安全性 , 将变化隔离
  3. 规范: 一般情况下, 不会对外直接暴露成员变量, 都会提供一些共有的方法进行赋值

6. getter-setter方法

  • getter方法
    • 作用: 获取成员变量的值
    • getter方法一定是对象方法
    • 一定有返回值,而且返回值一定和获取的成员变量的类型一致
    • 方法名称就是获取的成员变量的名称去掉下划线
    • 一定没有参数
    • 格式:
     -(int)size {
          return size; 
      }
  • setter方法
    • 作用: 设置成员变量的值
    • 优点: 监听属性变化
    • 一定没有返回值
    • 一定以set开头, 并且set后面跟上需要设置的成员变量的名称去掉下划线, 并且首字母大写
    • 一定有参数, 参数类型一定和需要设置的成员变量的类型一致, 并且参数名称就是成员变量的名称去掉下划线
    - (void)setSize:(int)size{
        _size = size;
    }

7. 点语法

  1. 如果给属性提供了getter和setter方法, 那么访问属性就又多了一种访问方式 , 点语法
  2. 点语法其实它的本质是调用了我们的setter和getter方法
  3. 点语法是一个编译器的特性, 会在程序翻译成二进制的时候将.语法自动转换为setter和getter方法
  4. 如果点语法在=号的左边, 那么编译器会自动转换为setter方法
  5. 如果点语法在=号的右边, 或者没有等号, 那么编译器就会自动转换为getter方法
  6. 注意点: 点语法一般用于给成员变量赋值, 如果不是给成员变量赋值一般情况下不建议使用, 但是也可以使用

8. self

  1. self怎么用
    • 类方法中, 使用self可以直接调用类方法 ( 此时, self == 类名)
    • 类方法中, 不能直接使用self调用对象方法
    • 类方法中, self不能访问成员变量
  2. self是谁
    • 如果self在对象方法中, 那么self久代表”调用当前对象方法的那个对象”
    • 如果self在类方法中, 那么self就代表”调用当前类方法的那个类”
  3. self的注意事项
    • self不能离开类, 离开类之后没有任何意义
    • self会自动区分类方法和对象方法, 如果在类方法使用self 调用对象方法, 那么会直接报错
    • 不能在对象方法或者类方法中利用self调用当前self所在的方法
  4. self的使用场景
    • 可以用在对象方法之间互相调用
    • 可以用在类方法之间互相调用
    • 可以用在区分成员变量和局部变量同名的情况

9. 继承

  1. 继承, 可以解决重复代码太多的问题
  2. A类继承了B类, A类就是B类的子类. B类就是A类的父类(或称 “超类”). A类会拥有B类的所有属性和方法(包含对象方法和类方法)
  3. 继承的语法:
    • @interface 类名 : 需要继承的类
    • 例如 @interface UIView : NSObject
  4. 继承的其他特性
    • 如果子类中有和父类中同名的方法, 那么我们称之为方法重写
    • 注意:继承中的方法调用顺序, 如果自己有就调用自己的, 如果自己没有就调用父类的
    • 方法的调用顺序, 先自己再父类, 如果父类中没有再爷爷类, 如果爷爷类再没有就找爷爷的爸爸类
    • 如果一直找到NSObject类都没有找到, 那么就会报错
    • reason: ‘-[Iphone signalWithNumber:]: unrecognized selector sent to instance 0x1003043c0’
    • 在继承中除了对象方法可以重写, 类方法也可以重写
  5. 继承的优点
    • 提高代码的复用性
    • 可以让类与类之间产生关系. 正是因为有了这个(继承)关系, 才有了多态
    • 注意:继承需要满足一定条件, 才适合使用.
      • 条件: XXXX 是 XXX / 某某某 is a 某某某
  6. 继承的缺点
    • 耦合性太强( 依赖性太强 )

10. super

  1. 只需要利用super给父类的方法发送一个消息, 那么系统就会自动调用父类的方法
  2. 如果以后想在子类中调用父类的方法可以使用super
  3. 如果想在给父类方法进行扩展的同时保留父类的方法, 那么可以使用super调用父类同名的方法
  4. super在类方法中, 一定会调用父类的类方法
  5. super在对象方法中, 一定会调用父类的对象方法
  6. 可以利用super在任意方法中调用父类中的方法

11. 多态

  1. 什么是多态? - - - 事物的多种表现形态
  2. 在程序中如何表现 - - - 父类指针指向子类对象
  3. 优点 - - - 提高了代码的扩展性
  4. 注意点 - - - 如果父类指针指向子类对象, 如果需要调用子类特有的方法, 必须先强制类型转换为子类才能调用

12. 实例变量修饰符

  1. @public就是实例变量修饰符
  2. @public
    • 可以在其它类中访问被public修饰的成员变量
    • 可以在本类中访问被public修饰的成员变量
    • 可以在子类中访问父类中被public修饰的成员变量
  3. @private
    • 不可以在其它类中访问被private修饰的成员变量
    • 不可以在子类中访问父类中被private修饰的成员变量
    • 可以在本类中访问被private修饰的成员变量
  4. @protected
    • 不可以在其它类中访问被protected修饰的成员变量
    • 可以在本类中访问被protected修饰的成员变量
    • 可以在子类中访问父类中被protected修饰的成员变量
    • 注意: 默认情况下所有的实例变量都是protected
  5. @package
    • 介于public和private之间的
    • 如果是在其它包中访问那么就是private的
    • 如果是在当前代码所在的包种访问就是public的
  6. 实例变量修饰符作用域: 从出现的位置开始, 一直到下一个修饰符出现
  7. 如果没有遇到下一个实例变量修饰符, 那么就会修饰后面所有的实例变量

13. description

  1. 应用场景
    • 只要利用%@打印某个对象, 系统内部默认就会调用父类的description方法
    • 可以重写description方法, 返回我们需要打印的内容
    • 只要利用%@打印对象, 就会调用description
    • 如果打印的是对象就会调用-号开头的description方法
    • 如果通过%@打印对象就会调用-号开头的
    • 如果通过%@打印类对象就会调用+号开头的
  2. 建议
    • 建议: 在description方法中尽量不要使用self来获取成员变量\
    • 因为如果你经常在description方法中使用self, 可能已不小心就写成了 %@, self
    • 如果在description方法中利用%@输出self会造成死循环
  3. 调用该方法, 该方法会返回一个字符串, 字符串的默认格式 <类的名称: 对象的地址>
  4. %@是用来打印对象的, 其实%@的本质是用于打印字符串
  5. class注意c是小写, 只要给类发送class消息, 就会返回当前类的类对象
1.获取Person对应的类对象
Class c = [Person class];

2.打印Person的类对象
NSLog(@"当前对象对应的类 = %@",c); 
NSLog(@"当前对象的地址 = %p",c);
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值