终于可以使用Xcode进行开发了,不需要在输入繁琐的编译链接命令了
1.Xcode如何编译和链接工程内的文件的?
//.h和.m没有任何相关性的关系
.h文件里面放声明保证项目中.m文件一起编译时没有语法错误(未声明的类型成员变量和方法、函数等)
在链接阶段,运行环境去寻找.m文件中(.o)相应的实现方法,(在所有的文件中找,而不是只在与.h同名的.m文件中)从而保证链接通过
.h文件和.m文件的分开,同时在编写程序时只包含.h文件,使得保证各种函数和类的声明可能有多次,但是实现只有一次(因为从来未包含.m文件)
#import关键字又保证声明只有一次
Xcode是将所有的.m文件一起编译、链接
完成项目时严格要求:
1.定义一个类分2个文件:.h声明文件、.m实现文件
.h:成员变量、方法的声明
.m:方法的实现
2.
如果想使用一个类,只需#import类的.h文件
2.Xcode断点调试
在相应地行首设置断点,点击运行之后程序便卡在设置的第一个断点处,此时可以查看之前的语句执行之后各个参数的值;
Xcode的下侧出现调试窗口,点击continue program execution可以让程序继续执行到下一个设置断点的行;
点击step into可以进入当前行执行代码时要调用的函数内部(不论函数的内部是否设置了断点),进入后可以点击step out返回;
点击停止运行来停止调试程序或者不断点击continue program execution直至程序结束。
在断点处点击右键 Disable Breakpoint可以让当前行的断点失效;
Delete Breakpoint可以删除断点;
直接将断点拖拽到代码处也可以删除断点。
3.创建代码快照(Code Snippet)
对于一些经常重复使用的代码可以创建代码快照,下次使用时可以直接输入提示符即可,创建过程如下:
首先,打开Xcode并在utilities panel中选择code snippet library。
接着,输入希望创建的code snippet。选中代码块,
然后单击并按住代码块,知道文本光标变为箭头光标。接着将代码块拖放到code snippet library中,然后松开鼠标。
此时会弹出一个popover,通过该popover可以对新的code snippet进行编辑
首先,是定snippet的名字
然后,指定该snippet的completion shortcut(可选项)假设我指定为“pm”。
这样设置以后,在Xcode的代码编辑器中只需要输入快捷方式(pm),就能简单的将这个snippet添加到代码中。非常有用!
4.注释标记
Xcode支持一种特殊的注释#pragma
经常使用下面两种用法:
#pragma mark 注释标记
#pragma mark - 注释标记 代码分区
可以在文件中添加这样的注释,下次在文件浏览器中就很容易找到做了标记的部分。
5.OC的点语法
用于简化get和set操作而设计的语法,易于让其他语言的开发人员接受。
点语法:后面不是成员变量
点语法的本质是方法调用:转化过程
stu.age = 10; ----->>
[stu setAge:10];//setter
p.age;---->>
[p age];//getter
使用注意
若在set(或get方法)中使用了set点语法(或get点语法)会导致死循环
- (void)setAge:(int)age
{
self.age = age;//[self setAge:age];
}
- (void)age
{
returnself.age;//[self age];
}
示例如下:#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
@end
#import "Person.h"
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p = [Person new];
p.age = 10;
p.age;
return 0;
}
6.成员变量作用域
OC成员变量使用不同的关键字的不同作用域
@public 在任何地方都能访问对象的成员变量
@private 只能在当前类的对象中访问其他地方不能访问,但子类中有这个成员变量
@protected 能在当前类和子类对象方法中访问(默认使用protected)
@package 只要处在同一个框架中,就能直接访问对象的成员变量
在类的实现中添加成员变量 默认是private
7.@property和@synthesize关键字---------@property:可以自动生成某个成员变量的setter和getter声明
@property int age;//相当于下面两句
- (void)setAge:(int)age;
- (int)age;
----------@synthesize自动生成age(property)的setter和getter实现,并会访问_age这个成员变量
用法:@synthesize age = _age;//相当于下面两句
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
如果_age这个成员变量不存在 就会自动生成@private类型的_age的变量
意味着类声明中没有_age,而在类实现中直接使用@synthesize age = _age;也可以。
如果不指定值@synthesize age 就会访问age这个成员变量
意味着这一句相当于@synthesize age = age;
@property int speed, wheels;类型相同可以写在一起,以便同时定义多个成员变量,同时生成他们的get和set方法声明。
***************生成get和set方法的最简写法(Xcode4.4开始支持)
@property int age;
一句完成的工作:
1.添加成员变量_age(private):
@private
int _age;
2.声明getter和setter方法
@property int age;
3.实现getter的setter方法
@synthesize age = _age;
注意点:
----如果自己在@implementation中写了setter和getter,但是没有在@interface中声明_age成员变量(这种情况的可能应该是疏忽大意),
@property int age;不会再帮助生成_age成员变量;
----如果只是在@implementation中写了setter或者getter两个方法中的一个,
@property int age; 依然会帮助生成 _age 成员变量和两一个方法。因此有下面两种简化代码的方式:
方式一:
在@interface中声明属性 和使用@property生成getter和setter声明
在@implementation中使用@synthesize生成getter和setter的实现
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
int _height;
}
@property int age;
@property int height;
@end
#import "Person.h"
@implementation Person
@synthesize age = _age;
@synthesize height = _height;
@end
在@interface中声明属性 和使用@property生成getter和setter声明并在@implementation中生成实现
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
int _height;
}
@property int age;
@property int height;
@end
在@interface中使用@propert生成属性,生成getter和setter声明并在@implementation中生成实现
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@property int height;
@end