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


知识要点: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)方法调用优先级:分类(最后与编译的分类优先)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值