您的位置:首页 > 移动开发 > Objective-C

黑马程序员------object-c简史及对比基本语法与其他语言的不同

2014-10-04 19:56 471 查看
知识要点: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)方法调用优先级:分类(最后与编译的分类优先)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  object