OC语言(三)

时间:2023-03-09 06:17:47
OC语言(三)

十九.一些规范


import系统自带的用尖括号<>来包含。

发现需求不清晰,一定要先搞明白才去做。

多文件开发,文件名和类名一致

命令行里的做法:(只是编译链接主文件,但是全部编译链接会出错)

1.每个文件都要引入主框架(如果使用了NSObject)
2.如果用到了其他类,也要引入
3.主文件要引入所有用到的类

正式的做法:(所有文件一起编译链接)

借鉴C语言的做法,写h文件来包含声明。

import不要包含源文件,容易发生重复定义错误(duplicate)。

把类的声明(@interface)放到.h文件中。

******定义一个类分为两个文件.h和.m
.h:放 成员变量 和 方法的声明(@interface)
.m:放 方法的实现(@implementation)
主文件则用来融合所有的.h

二十.XCode新建类

使用Cocoa Class创建类可以同时生成.h和.m

二十一.XCode断点调试

设置断点,在output框上测有空心向右的箭头按钮表示前进,把鼠标暂留在变量上可以查看详细信息。

单步按钮的前方是断点是否有效的按钮。

删除断点:按住断点向外拖

二十二.生成代码块

左键长按代码块直到出现箭头,然后拖入右下角代码块内

OC语言(三)

shortcut是触发条件,当检测到相应的输入就可以替换为相应的代码框

二十三.特有注释

#pragma mark xxx

可以用索引进行定位。

使用
#pragma mark - xxx 可以在方法前产生横线分隔符

特殊技巧

#pragma mark - group1
xx
xx
xx
xx
#pragma mark - group2
xx
xx
xx
xx

这样可以产生两组

二十四.多文件查看

采用的是和视图窗口内编辑一样的方法,
在View->Assistant内可以修改第二视窗的显示位置

二十五.点语法


为了兼容其他语言的点运算符。

当编译器遇到点语法,会把点语法转化成set方法

stu.age = 10;展开为:
[stu setAge : 10];

注意age并不是成员变量

p.age 是get方法,看有没有赋值。

OC语言(三)

前面的按钮可以在断点处跳入应该跳转的函数。

在get和set方法中不要再用点语法,否则会引发死循环。

点语法不是访问成员变量,而是转成set和get方法。

必须先定义set和get方法,才能使用点语法。

二十六.成员变量作用域

@private 只能在当前类的对象方法中实现

@protected 只能在当前类及其子类的对象方法中实现(在声明中什么都不写默认是@protected)

@public 任何地方都能直接访问对象的成员变量

@package 只要处在同一个框架中,就能直接访问

只要声明一次作用域,下面的都是该作用域。

在实现里面定义成员变量默认私有。不要这么写,因为包含.h时不能探测到。
因为.m不会被包含。

虽然子类不能访问父类的私有变量,但是内存中有该变量。

OC是单继承。

二十七.一些编译器特性

@property 可以自动生成某个成员变量的set和get方法声明。

例如对于
int _age这个成员变量:

@property int age;

@property后面的是对set的参数类型和get的返回值类型的说明。

会自动变成
  set方法:
  • (void)setAge:(int)age;
  get方法:
  • (int)age;

@synthesize 生成property的set和get实现。

对于上面的,用@synthesize age = _age来实现。
后面的表示真实访问的是哪个成员变量。

小技巧:类型一样的可以写在同一行。但是一般是分开写。
如果不写成员变量,@property会自动生成private成员变量。(加下划线的),会根据实现里面的=后面的来生成。

Xcode4.4以后,可以只写@property。

但是自动生成的是@private作用域。

@synthesize age;自动生成的是age成员变量而非_age,系统会自己使用self进行区分。

如果已经写了get或者set方法,Xcode会自动生成没有的,而不会覆盖已有的。

设成员变量为_xxx
则get的标准写法为: 
- (类型)xxx{
return _xxx;
}
set的标准写法为:
- (void)setXxx : (类型)xxx{
_xxx = xxx;