两种开发模式:
1.Clang 或 GCC 命令行
clang -fobjc-arc HelloWorld.m
<small> 其中-fobjc-arc
支持ARC内存管理。执行命令:./HelloWorld
</small>
2.Xcode项目:
构建正规工程项目
使用大型框架,追求设计质量与代码组织
oc语言与C语言等的区别:
oc文件分为.m和.h文件,.h文件为声明文件 .m为实现文件。
oc的字符串表示:@"helloworld"
oc中方法的调用: [obj function]
<small>这种调用方式又称为向对象发送消息</small>
[[ClassName alloc] init]
//alloc申请内存,然后调用类对象初始化函数
在oc中所有的对象必须以指针的形式存在:
类--引用类型
<small> 类:位于栈上的指针指向位于堆中的实体对象,所以是引用类型。比如oc中的字符串类,就需要用指针来表示NSString *str = @"hello";
</small>
结构--值类型
<small>实例直接位于栈中int n = 1;
</small>
数据成员
对内:实例变量
对外:属性(默认公有)
<small>没有私有属性这一说法</small>
实例变量:
1.可以定义实例变量,而不定义属性。只有实例变量,没有类变量。
通常实例变量定义在m文件中
2.如果同时自定义了getter和setter访问器方法,或者针对只读属性定义了getter访问器方法,编译器将不再合成实例变量
3.在类外一律使用属性来访问,类内大多也通过self使用属性访问。
只有以下情况使用实例变量来访问:
-初始化器init
-析构器dealloc
-自定义访问器方法
属性:
1.属性表达实例状态,描述类型对外接口。相比直接访问实例变量,属性可以做更多的控制
2.默认情况下,编译器会为属性定义propertyName自动合成:
-一个getter访问器方法:propertyName
-一个setter访问器方法:setPropertyName
-一个实例变量_propertyName
属性的特征:
属性的描述特性(attribute)可以指定属性不用环境下的不用功能
1.读写特性:读写属性readwrite(默认),只读属性readonly
2.多线程特性:原子性 atomic(默认),非原子性nonatomic
内存管理特性
ARC环境:强引用strong(默认),弱引用weak阻止循环利用,拷贝属性copy创建独立拷贝
<small>这些都是为了实现内存的优化管理,使用copy可以防止外部指针的改变导致类内的属性发生变化</small>
方法参数
oc中将参数融入了函数名中:
-(void)moveToX:(int)x toY:(int)y { self.x = x; self.y = y; }
<small>其中Tox,toy为外部参数名,x,y为内部参数名</small>
调用:[p1 moveToX:100 toY:200]
正因为如此,调用时,第一个参数名忽略,但是后面的参数名必须是显示标明
对象初始化器
初始化队形实例时,init通常和alloc搭配使用
alloc所做的事——NSObject已实现
1.在堆上分配合适大小的内存
2.将属性或者实例变量的内存置0
init所做的事——可以自定义
1.调用父类初始化器[super init]
2.初始化当前实例变量(注意使用实例变量_property,不要使用属性)
<small>对象初始化器可以有多个,通常我们选一个参数最多的作主初始化</small>
-(id) initWithX: (int) x WithY:(int)y
{
self=[super init];
if(self){
_x=x;
_y=y;
}
return self;
}
对象析构器
负责释放对象拥有的动态资源:
自动实现:1.ARC将对象属性引用计数减持
手动实现:2.释放不受ARC管理的动态内存,如malloc分配的内存
手动实现:3.关闭非内存资源,如网络端口
delloc由ARC根据对象引用计数规则在释放对象内存前自动调用,无法手工调用
子类的dealloc会自动调用父类的dealloc(后置调用)