OC基础语法and类和对象

一、OC基础语法

1、关键字
基本上所有关键字都是以@开头,如:
@interface   @implementation   @end 
@public   @protected   @private   @selector 
@try   @catch   @throw   @finally  
@protocol   @optional   @required   @class
@property   @synthesize   @dynamic
self   super   id   _cmd   __block   __strong   __weak

2、字符串以@开头
比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串

3、其他语法
基本数据类型:char、int、float、double、BOOL(YES\NO)
屏幕输出:NSLog(@“XXXXX”);NSLog(@“XXXisXX %i”,XX);

4、NSLog与printf的区别
NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数
NSLog输出后会自动换行,printf输出后不会自动换行
使用NSLog需要#import
使用printf需要#include

5、一般形式:

#import <Foundation/Foundation.h>
int main()
{
    NSLog(@"helloworld");
    return 0;
}


6、#import的作用
跟#include一样,用来拷贝某个文件的内容
可以自动防止文件内容被拷贝多次,也就以为着头文件中不用加入下面的预处理指令了
#ifndef _STDIO_H_
#define _STDIO_H_
#endif

7、Foundation框架的作用
1.开发OC、iOS、Mac程序必备的框架
2.此框架中包含了很多常用的API(应用编程接口)
3.框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可
#import
说明:
 1> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中的所有其他头文件
 2> Foundation框架的主头文件名称就是Foundation.h
 3> 只需要包含Foundation框架主头文件,就可以使用整个框架的东西
 
 运行过程:
 1> 编写OC源文件:.m、.c
 2> 编译:cc -c xxx.m xxx.c
 3> 链接:cc xxx.o xxx.o -framework Foundation
   (只有用到了Foundation框架才需要加上-framework Foundation)
 4> 运行:./a.out

8、BOOL的使用
BOOL类型的变量有2种取值:YES、NO
#define YES (BOOL)1
#define NO  (BOOL)0
BOOL的输出(当做整数来用)
NSLog(@"%d %d", YES, NO);

9、多个.m文件的开发
  跟C语言中多个.c文件的开发是一样的

  编写3个文件

// main.m
#import "one.h"
int main()
{
    test();
    return 0;
}
// one.h
void test();
// one.m
#import <Foundation/Foundation.h>
void test()
{
    NSLog(@"调用了test函数");
}

终端指令
编译:cc –c main.m test.m
链接:cc main.o test.o –framework Foundation
运行:./a.out

10、.m文件和.c文件混用开发

  编写3个文件

// main.m
#import "one.h"
int main()
{
    test();
    return 0;
}
// one.h
void test();
// one.m
#import
void test()
{
    NSLog(@"调用了test函数");
}

终端指令
编译:cc –c main.m one.c
链接:cc main.o one.o
运行:./a.out
(没有使用Foundation框架的话,就不用-framework Foundation)

二、OC的类和对象
1、类的声明
1)类的设计:
1> 类名
* 类名的第一个字母必须是大写
* 不能有下划线
* 多个英文单词,用驼峰标识(每个单词首字母大写)
2> 属性
3> 行为(功能)

注:拥有相同(或者类似)属性和行为的对象都可以抽像出一个类

#import <Foundation/Foundation.h>
// 类的声明
@interface Car : NSObject
{
    @public
    int wheels; // 多少个轮子
    int speed;  // 时速
}
- (void)run;    // 跑的行为
@end

成员变量
@interface的大括号{}中声明的变量:wheels、speed
@interface的大括号和函数的大括号是不一样的
默认会初始化为0

@public
@public可以让Car对象的wheels和speed属性被外界访问

NSObject
加上:NSObject的目的是让Car类具备创建对象的能力

2、类的实现
用来实现@inteface中声明的方法
方法的实现(说清楚方法里面有什么代码)

// 类的实现
@implementation Car
- (void) run
{
    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end

1.只要是OC对象的方法,必须以减号 - 开头
2.OC方法中任何数据类型都必须用小括号()扩住
3.OC方法中的小括号():括住数据类型

注:

没有@interface,只有@implementation,也是能成功定义一个类的

@implementation Car : NSObject
{
    @public
    int wheels; // 多少个轮子
    int speed;  // 时速
}
- (void) run
{
    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end
// @implementation中不能声明和@interface一样的成员变量


3、创建对象

    代码编写

// 主函数
int main()
{
    // 创建车子对象
    Car *c = [Car new];
    c->wheels = 3;
    c->speed = 300;
    
    [c run];
    return 0;
}

注:
1.在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]
2.利用类来创建对象
3.执行了Car这个类的new行为来创建新对象
4.定义了一个指针变量p,p将来指向的是Car类型的对象
5.[Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)

main函数的代码分析、内存分析(对象在内存中有成员)
[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Car new];
用一个指针变量c指向内存中的Car对象
设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 3;
c->speed = 300;

4、创建多个Car对象

     分别只设置wheels、speed属性

Car *c1 = [Car new];
c1->wheels = 4;
Car *c2 = [Car new];
c2->speed = 250;
[c1 run];
一个赋值给另一个,然后修改属性
Car *c1 = [Car new];
c1->wheels = 4;
c1->speed = 250;
Car *c2 = c1;
c2->wheels = 3;
[c1 run];

    常见错误:
只有类的声明,没有类的实现
漏了@end
@interface和@implementation嵌套
两个类的声明嵌套
成员变量没有写在括号里面
方法的声明写在了大括号里面

5、方法
    1>不带参数的方法
设计一个返回PI的方法
// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
    return 3.14;

}

    2>带一个参数的方法
设计一个计算平方的方法
// 方法声明
- (double)square:(double)number;
// 方法实现
- (double)square:(double)number
{
    return number * number;
}
    3>带多个参数的方法
设计一个计算和的方法
// 方法声明
- (double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法实现
- (double)sumOfNum1:(double)num1 andNum2:(double)num2
{
    return num1 + num2;
}
    4>方法名注意:
1.冒号也是方法名的一部分
2.同一个类中不允许两个对象方法同名 OC方法中
3.一个参数对应一个冒号
    5>OC方法注意:
1.成员变量不能在{}中进行初始化、不能被直接拿出去访问
2.方法不能当做函数一样调用
3.成员变量\方法不能用static等关键字修饰,别跟C语言混在一起
4.类的实现可用写在main函数的后面,主要在声明后面就行了
5.方法只有声明,没有实现
6.方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
7.编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

 6、方法和函数的区别:  
 方法
 1.对象方法都是以减号 - 
 2.对象方法的声明必须写在@interface和@end之间
   对象方法的实现必须写在@implementation和@end之间
 3.对象方法只能由对象来调用
 4.对象方法归类\对象所有
 
 函数
 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
 2.函数调用不依赖于对象
 3.函数内部不能直接通过成员变量名访问某个对象的成员变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值