分类: iOS平台
2015-04-09 10:28:59
OC在IOS开发中,主要负责UI界面。
C/C++在IOS开发中主要是做图形处理。
OC在C语言基础上增加了最小的面向对象的语法,把复杂的面向对象语法全部去掉了。
OC没有包名及命名空间,取而代之的是在类前面加上前缀,如NSString中的NS
字符串也以@开头 如@"hello"
self相当于java中的this
nil相当于java中的null
OC里面只支持单继承,及一个类只有一个父类
OC不支持垃圾回收,需要手动释放对象
NSLOG(),结束后自动换行,并且带有时间和项目名信息。如下:
#import
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!”);
NSLog(@"Hello, World!");
}
return 0;
}
结果:
2015-03-17 15:22:36.828 基础1[896:303] Hello, World!
2015-03-17 15:22:36.830 基础1[896:303] Hello, World!
新一版本的SDK增加了ARC功能,编译器在编译的时候,他会自动检测没用释放对象的地方,然后自动帮你增加释放对象的语句。
OC里面代码的扩展名是.M
ccc *c1 = [[[ccc alloc] initWithAge:100 andNo:222] autorelease]; 自动释放内存
一般系统自带的静态方法都会自动释放内存。
self:动态方法里面代表调用他的对象
静态方法里面表示调用它的类名 +(void)fun{ [self alloc] }
[student new]也可以分配内存然后初始化。
student *su = [[student alloc] initWithAge:19 andNo:11];等效于
student *su = [student new];
OC中的类分为两个文件
.h 类的声明文件,用于变量,方法的声明
.m 类的实现文件,用于实现.h中的方法
静态方法:用类名调用的方法 前面写+
动态方法:用对象调用的方法 前面写-
release 释放对象的方法,只能释放一次,否则会报错
aaa.h:
#import
@interface aaa : NSObject{//成员变量都定义在了{}里面
int age;
int no;
}
-(int)age;
-(int)no;
-(void)setAge:(int)a setNo:(int)b;
@end
#import "aaa.h"
@implementation aaa
//getAge命名不适合OC,OC命名get方法直接写为age
-(int)age{
return age;
}
-(int)no{
return no;
}
-(void)setAge:(int)a setNo:(int)b{
age = a;
no = b;
return ;
}
@end
main.m:
#import
#import "aaa.h"//需要用到aaa对象,就得引用aaa.h
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建一个aaa对象
//调用静态方法alloc来分配内存
aaa *a1 = [aaa alloc];
//调用动态方法init来进行初始化
a1 = [a1 init];
//为了方便可以写成下面这样
aaa *a2 = [[aaa alloc] init];
[a1 setAge:20 setNo:1];
int x = [a1 age];
int y = [a1 no];
NSLog(@"age--%d,no--%d",x,y);
//会报错,因为ARC已经自动添加了释放的语句。
//[a2 release];
//[a1 release];
}
return 0;
}
-(void)setAge:(int)a setNo:(int)b; 他的方法名字叫setAge:setNo: *注意":"和两个方法名字都要写上
成员变量一般命名时候前面加 “_”
设置断点:点击代码左侧会生成断点
用 %@ 来打印对象
点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。下面是一个点语法的简单例子,代码如下:
bbb.h:
#import
@interface bbb : NSObject{
int age;
}
-(int)age;
-(void)setAge:(int)a;
@end
bbb.m:
#import "bbb.h"
@implementation bbb
-(int)age{
NSLog(@"get方法");
return age;
}
-(void)setAge:(int)a{
NSLog(@"set方法");
age = a;
}
@end
main.m:
#import
#import "bbb.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
bbb *b1 = [[bbb alloc] init];
//点语法
b1.age = 10;//实际等效于 [b1 setAge:10] 是编译器自动转换的 如果没有setAge方法,则会报错。
int i = b1.age;//实际等效于 int i = [b1 get]; 如果是被赋值就调用set方法,其他的就调用get方法
}
return 0;
}
ccc.h:
#import
@interface ccc : NSObject{
int _age;
int _no;
}
-(void)setAge:(int)age setNo:(int)no;
-(int)age;
-(int)no;
//自己写一个构造方法
-(id)initWithAge:(int)age andNo:(int)no;
@end
ccc.m:
#import "ccc.h"
@implementation ccc
-(void)setAge:(int)age setNo:(int)no{
_age = age;
_no = no;
return;
}
-(int)age{
return _age;
}
-(int)no{
return _no;
}
-(id)initWithAge:(int)age andNo:(int)no{
//首先要调用super的构造方法
//因为 [super init] 有可能返回nil
if( (self = [super init]) != nil){
_age = age;
_no = no;
}
return self;
}
//重写父类的description方法
//当使用%@打印一个对象的时候,会调用下面的方法
-(NSString *)description{
NSString *s = [NSString stringWithFormat:@"age--%d,no--%d",_age,_no];
return s;
}
@end
main.m:
#import
#import "ccc.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
ccc *c1 = [[ccc alloc] initWithAge:100 andNo:222];
NSLog(@"age--%d,no--%d",c1.age,c1.no);
NSLog(@"%@",c1);
}
return 0;
}