看来不精通OC还是不行的,今天开始再重新来回顾一遍OC所有的语法。
从无到有凝练一遍。
加油💪!
第一章 基础部分
1.1 程序逻辑结构
Objective-C 的程序分为三个部分
-
@interface
部分
这一部分声明了相关类、属性等的声明
在实际的工程中,这部分的声明写在.h
文件里面。也有一些属性(出于方便?)会定义.m
文件里。 -
@implementation
部分
这一部分定义了相关类、属性等的声明,
在实际的工程中,这部分的声明写在.m
文件里面。 -
Program
部分
这一部分以main
函数开头。实际的工程里面涉及到底层代码的入口?
1.2 类、属性语法
[ClassName Method]
可以理解为 [Receiver Message]
初始化一个类
ClassName *VariableName = [[ClassName alloc] init]]
第二章 控制流-循环结构
2.1 for
循环
OC的For循环跟C语言的如出一辙。
for (n = 1, sum = 0; n <= 10; n++ ) {
sum = sum + n;
}
for
循环的任何位置都可以包含多个表达式 ,只要用逗号分隔这些表达式(不是多条语句而是多个表达式)即可。
2.2 while
语句
本章内容都是与C相似
while ( expression )
program statement
2.3 do
语句
do
语句是while
的简单转置,它把循环条件放在循环的结尾,而不是开头。
do
program statement
while ( expression );
2.4 break
语句
break
退出当前循环
break;
2.5 continue
语句
continue
跳过当前循环中的某些语句直到当前这环循环的结尾
第三章 控制流-选择结构
3.1 if
语句
if ( expression )
program statement
3.2 if-else
结构
if ( expression )
program statement 1
else
program statement 2
3.3 复合条件测试
- 逻辑与
&&
- 逻辑或
||
3.4 switch
语句
不添加break
会自动贯穿
switch ( expression )
{
case value1:
program statement
program statement
...
break;
case value2:
case value3:
program statement
program statement
...
break;
...
case valueN:
program statement
program statement
...
break;
default:
program statement
program statement
...
break;
}
3.5 条件运算符
condition ? expression1 : expression2
第四章 类
4.1 分离接口和实现文件
通常类的声明( @interface
部分 )要放在它自己的名为 ClassName.h
的文件中。 而类的定义( @implementation
部分 )通常放在同名的ClassName.m
。 并在ClassName.m
文件中使用以下语句将接口文件导入到实现文件中去#import "ClassName.h"
< >
是引用系统文件。
" "
双引号是引用本地文件
4.2 合成存取方法
1.在@interface
中声明的时候在属性前面加上 @property
2.在@implemetation
中实现的时候在属性前面加上 @synthesize
如果没有给变量加上存取方法的话,这个变量只能在类的内部被访问。也就是说用对象访问属性 [ObjectName propertyName]
会失败。
注意⚠️:如果只用了@property 而没有用@sythesize的话,编译器生成的实例变量会以下划线
_
字符作为变量名称的第一个字符。
除了自动存取方法意外,用同名函数setProperty: value 可以定义设值方法,同名的property: 可以定义取值方方法。
注意⚠️: 自动合成的方法不要以
new
,alloc
,copy
和init
开头,因为编译器会自动合成相应的方法。
@interface ClassName : NSObject
@property type propertyName;
@end
@implementation ClassName : NSObject
@synthesize propertyName;
@end
4.3 访问属性
定义一个类ClassA
类有一个属性aProperty
ClassA className = [[ClassA alloc] init ];
// 访问属性
className.aProperty //方式一
[className aProperty] //方式二
注意⚠️:
.
点运算符通常用在属性上,用于设置或取得实例变量的值。也就是说除了访问设置和取值方法外,在良好的编码风格上来说,只能访问属性。
4.4 方法
4.4.1 多参数方法
@interface Class : NSObject
- (void) runFromAPlace : (NSString *) aPlace toAPlace: (NSString *) aPlace;
4.4.2 不带参数名的方法
@interface Class : NSObject
- (void) runFromAPlace : (NSString *) aPlace: (NSString *) aPlace;
4.5 变量
4.5.1 局部变量
局部变量是基本的C数据类型,并没有默认的初始值,所以在使用前要先赋值,。局部变量初始化为nil。
方法的参数就是一种局部变量。 但是如果方法的参数是类的话,因为类是引用的,所以可以修改里面的数据。
4.5.2 static 静态变量
在变量声明前加上关键字 static
, 可以使局部变量多次调用保留同一个值
静态变量在程序开始时初始化一次,自动赋值为 0
注意⚠️: 类方法中定义的静态变量在被不同的实例调用时,引用的是同一个静态变量。比如一个方法中有一个统计次数的静态变量
count
, 所有实例调用它都会让它加一,所以它统计的是所有对象的次数之和。
通常会将变量的声明放在implementation
文件的开始处使得所有方法都可以访问到。
4.6 在方法中分配和返回对象
不管对象在那里被创建,只要它的引用为0就会被销毁,因为在方法里面创建并返回的对象始终被引用,所以没有背销毁。而局部变量的作用域只有在方法内。所以,在方法结束后,就没有对它的引用,也就自然被销毁了。