Objective-C学习

通过.m扩展名表示文件使用的是Objective-C代码,应由Objective-C编译器处理

#import语句

#import语句来引用头文件,保证头文件只被包含一次,无论这条命令在该文件中出现了多少次

(C语言中:#ifdef来避免一个文件包含另一个文件而后者又包含前者;objective-c用#import实现)

框架

框架是一种把头文件、库、图片、声音等内容聚集在一个独立单元中的集合体。

苹果公司框架集:Cocoa(包括Foundation和Application Kit)、Carbon、QuickTime、OpenGL

Foundation框架处理的是用户界面之下的那些层的特性,比如数据结构和通信机制

NSLog()和@“字符串”

作用和C中的printf()比较像,可以用print f()代替,但是NSLog()可以自动换行

NSString:@是本体

eg:NSLog(@"Hello,Objective-C!");

@意味着引号内的字符应作为Cocoa的NSString元素来处理

NSString支持的功能:长读、与其他字符串比较、将自身换成整型值或者浮点值

布尔类型

 C:true false

Objective-C:YES NO        占8位

实际上是一个signed char类型 通过#define将YES定义为1 NO为0

如果是一个更大的整型值赋给了BOOL 那么取低8位

面向对象

OOP:面向对象编程

对象:一种包含值和指向其类的隐藏指针的结构体

实例:对象的另一种称呼

“间接”:编写一段代码来完成别的任务

OOP中,不再重点关注函数,专注数据;数据通过间接方式引用代码,代码可以对数据进行操作。

id:是一种 泛型,可以用来引用任何类型的对象 

[]:通知某个对象该去做什么,方括号中第一项是对象,其余部分是需要对象执行的操作

(☝️发送消息/调用方法)

接口:类为对象提供的特性描述

实现:使接口能正常工作的代码

@interface Circle:新类Circle的接口

-:方法的声明

- (void) setBounds: (ShapeRect) bounds;

-(void):声明一个新方法 返回值为void

setBounds: :setBounds是方法名         ‘:'是说后面会出现参数

(ShapeRect) bounds:参数名和参数类型

如果有参数就用冒号,如果没有就不需要

@implementation        使对象能运行的代码位于@implementation中

类名出现在@implementation后 结尾不需要分号        方法后也不需要

@implementation Circle

-(void) setFillCollor: (ShapeColor) c

{
fillColor = c;

}

不必按照interface的顺序来,而且可以新写 当作似有方法

接口是展示类的构造,实现是实现接口声明的方法

继承

用于声明新类的的语法:

@interface Circle: NSObject

冒号后边的标识符是需要继承的类

超类/父类:继承的类

子类/孩子类:执行继承的类

继承的方法调度:

先在子类中查找相应的方法 ,如果找不到,就到对象的超类中找,以此类推,在继承链中寻找,如果在最顶层NSObject类中也没找到,就会出现一个运行时错误,以及编译时的警告信息

如何访问实例变量:

 重写方法:

正常:父类的方法为空,子类的方法进行定义,直接调用重写后的方法

0super:既能重写方法的实现,又能调用超类中的实现方法

[super setFillerColor: c]

向super发消息的时候,实际上是在请求向该类的超类发送消息,如果超类中没有定义该消息,就会继续向继承链的上一级中查找

复合

建立类之间的关系,组合多个对象,让他们分工协作

accessor:读取或者改变某个对象属性的方法

getter:通过对象自身访问对象属性的方法

继承和复合:

继承是:is a

复合是:have a                                  

源组织文件

.h文件:存放接口部分代码:@interface指令、公共struct定义、enum常量、@defines、extern

.m文件:实现内容:@implementation指令、全局变量的定义、私有struct             

如果扩展名是.mm:编译器会认为是Objective-C++编写的代码,可以同时使用C++和Objective-C来编程

@class:前向引用

告诉编译器:trust me  以后自然会知道这个是什么;也可以循环引用如果在A. h 文件中使 用@class B , 在 B . h 中 使 用@class A , 那 么 这 两 个 类 就 可 以 互 相 引 用 了 。

引用子类的时候不能使用@class ,要用@import                     

Runtime

运行时 程序在运行的时候可以改变结果(引进新函数 删除存在的函数)

runtime就是一组API

.m文件执行clang -rewrite-objc main.m会生成.cpp文件 即编译后的文件

属性和对象没有存在在实例对象里,只存在在类对象里

SEL:方法编号

IMP:函数指针,保存了方法的指针

Method:SEL,IMP,类型描述字符串

类的动态配置

消息传递                                                

消息的发送

找到IMP

objc——msgSend:消息的接受者,消息的方法名,

消息的转发

找不到IMP后的一系列操作


​​​​​​​

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值