知识要点:obj-c背景,cocoa,Foundation,AppKit,UIKit
object-c:开发ios的语言,属于编译类的语言,(java既是解释型语言也是编译型语言),它需要通过编译,连接,才能运行,这点和c/c++语言是一样,但不同的是,比c语言多了面向对象,可以说c语言的超集,而和c++面向对象的特性也不同,oc的面向对象给人的感觉又有点像c#,java。oc是动态语言,简单来说在运行期间可以替换对象和对象的方法。oc还有反射机制。
cocoa:苹果公司提供的函数库,其他语言可以用桥接的方式调用,例如:RoboVM ,可以用java开发ios程序
foundation:是具体的框架,在oc程序中#import这里的头文件,它的功能是提供系统基本服务,例如:集合,日期和时间对象,操作URL流等功能
UIKit:所有的ios都基于这个类,它提供界面的绘制,事件响应,类似于java的swing。
AppKit:这个是做mac应用的工具类。
一些语法规则:
1.减号:减号表示一个函数、或者方法
2.中括号:就是用来调用写的这个方法,通常在oc里说“消息”
3.#import相当于c语言的#include,用来引库函数的。
4.还有一写面向对象语法@interface @implementation
5.BOOL类型是YES,NOT,不是ture,false
6.nil,相当于c语言的NULL,#define nil NULL
7.id,相当于c的泛型指针void *
8.oc的特殊语法规则有block,以^作为标记(在遍历NSArray时有用到)
void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
{
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");
9.protocol,协议类似于接口的概念@require是必须要实现的@option可以不实现
#import <Foundation/Foundation.h>
@protocol action <NSObject>
@required
-(void) eat;
-(void) run;
-(void) walk;
-(void) say;
@option
-(void) code;
-(void) paint;
-(void) playGame;
@end
#import "action.h"
@interface Person : NSObject <action>
@end
@implementation Person
-(void) walk
{
NSLog(@"The person walk");
}
-(void) run
{
NSLog(@"The person run");
}
-(void) say
{
NSLog(@"The person say");
}
-(void) eat
{
NSLog(@"The person eat");
}
-(void) code
{
NSLog(@"The perosn code");
}
@end
10.@property和@synthessize
Java中可以用Eclipse工具把生成getter,setter方法。
property用来自动生成getter,setter方法的声明,用于访问类的属性。
synthesize是自动生成getter,setter方法。
(1)在使用@synthessize时,赋成员变量,如果不存在可以自动生成private类型的成员变量。只能用在@interface间。
(2)如果光写@property的声明,会自动生成实现方法。(新特性)
(3)如果在@synthesize中不赋值,那么它默认选择_xxx(xxx是声明的名字)。只能用在@implementation中
@interface Monkey:NSObject{
int _age;
NSString *_name;
}
@property int _age;
@property NSString* _name;
@end
@implementation Monkey
@end
int main(int argc, const char * argv[]) {
Monkey *monkey = [Monkey new];
[monkey set_age:4];
[monkey set_name:@"Jill"];
return 0;
}
注:如果是自动生成getter、setter方法的对象,那么自动方法实现会是这个样子的
-(void)setHeart:(Heart *) heart
{
if(_heart != nil)
{
[_heart release];
_heart = [heart retain];
}
}
先释放旧对象,在申请新对象资源。不然原来资源没有释放,_herat指向了新的内存块,旧的那块没有释放,发生内存泄露。
11.Category 分类
用于类的分割,就是可以把类可以按功能在划分。
@interface Monkey:NSObject{
int _age;
NSString *_name;
}
@property int _age;
@property NSString* _name;
@end
@implementation Monkey
@end
@interface Monkey(Man)
@end
@implementation Monkey(Man)
-(void) play
{
NSLog(@"公星星在玩");
}
@end
int main(int argc, const char * argv[]) {
Monkey *monkey = [Monkey new];
[monkey set_age:4];
[monkey set_name:@"Jill"];
[monkey play];
return 0;
}
(1)分类只增加方法,不能增加成员变量
(2)分类方法中可以访问原来类中声明的成员变量
(3)分类可以重新实现原来类中的方法,但会覆盖掉原来的方法,原方法无法使用
(4)方法调用优先级:分类(最后与编译的分类优先)