开始学习OC,时间不等人啊,要抓紧了。

OC基本知识

新建一个以.m结尾的文件,这既是oc的程序文件。在oc程序中完全兼容C语言。编译好链接类似。

oc包含头文件是使用#import <>

import 和include 的区别:

  1:import和include一样的包含功能

  2:import可以自动防止文件被重复拷贝

 #import <Foundation/NSObjCRuntime.h>//NSLog头文件
//import 1:和include一样
// 2:可以自动防止文件被重复拷贝
int main()
{
NSLog(@"this is OC output");//自动换行
return ;
}

如果使用Foundation框架,则编译的时候需要添加参数 cc -c -framework Foundation a.m

每个框架都有自己的主头文件,和框架名一样,包含所有头文件。

如果有多个文件,编译顺序和c语言一样: cc -c one.m two.m -framework Foundation

BOOL类型(OC特有的)

  定义:typedef signed char BOOL;

  两种取值:

  #define YES (BOOL) 1

  #define NO (BOOL) 0

 #import <Foundation/Foundation.h>

 int main()
{
BOOL b = YES;//
BOOL b2 = NO;// NSLog(@"%d\t%d",b,b2);//1 0
return ;
}

面向对象

万物皆对象。

常用术语

  面向过程 Procedure Oriented

  面向对象 Object Oriented,简称OO

  面向对象编程 Object Oriented Programming,简称OOP

类和对象的区别

  类是对象的抽象。

  对象是类的实例。

类的构成:

   1、类名

    首字母大写,不能下划线,多个单词每个首字母大写

  2、属性

  3、行为(功能)

类的实现

 /*

1、类名
首字母大写,不能下划线,多个单词每个首字母大写
2、属性
3、行为(功能)
*/ #import <Foundation/Foundation.h>//NSObject //1、类的声明:属性和行为
@interface Car : NSObject//继承NSObject,使类具有创建对象的功能
{
//属性,也就是成员变量(实例变量),默认会初始化为0,默认是保护属性
@public
int wheels;//轮胎个数
int speed;//时速
} //方法(行为):返回值,方法名,参数
//只要是oc对象的方法,必须以‘-’开头
//OC方法中任何数据类型都必须用"()"括起来
//OC方法中小括号就是用来括住数据类型
- (void) run; @end //2、类的实现,用力实现@interface中声明的方法
@implementation Car
//方法的实现
- (void) run
{
NSLog(@"Running!");
}
@end int main()
{
//创建对象,返回对象的地址
Car *p = [Car new];//OC中执行任何行为都需要这个 [行为执行者 行为];
p->wheels = ;//赋值
p->speed = ;//赋值 [p run];//调用方法 NSLog(@"speed is %d!",p->speed);//输出速度 return ;
}

在类创建对象之前会把类加载到内存中,每个对象还都有一个ISA 指针,指向这个类。

对象和函数的区别

  • OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
  • C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
  • C函数不能访问OC对象的成员
  • 低级错误:方法有声明,但是实现的时候写成了函数
 #import <Foundation/Foundation.h>

 //1、类的声明
@interface Person: NSObject
{
@public
int age;//年龄
double weight;//体重
} - (void)walk;//行走 @end //函数1
void test(int age,int wei)
{
age = ;
wei = ;
}
//函数2
void test1(Person *p)
{
p->age = ;
p->weight = ;
} //2、类的实现
@implementation Person
//实现@interface中声明的方法
- (void)walk//行走方法的实现
{
NSLog(@"The person whoes age is %d and weight is %f is walking !",age,weight);
} @end int main()
{
Person *p1 = [Person new];//新建一个对象
p1->age = ;//年龄赋值
p1->weight = 66.7;//体重赋值
[p1 walk];//walk方法调用 Person *p2 = [Person new];//新建一个对象
p2->age = ;//年龄赋值
p2->weight = 77.0;//体重赋值
[p2 walk];//walk方法调用 //p2 = p1;//对象间赋值 //对象和函数
test(p1->age,p1->weight);//值传递,不改变原值
[p1 walk];//walk方法调用
test1(p1);//传地址,改变原值
[p1 walk];//walk方法调用 return ;
}

@interface 和@implementation分工

@interface 就相当于钟表表面

@implementation就是钟表内部的-实现

常见错误

  1、只有类的声明,没有类的实现

  2、漏了@end

  3、@interface和@implementation嵌套

  4、两个类的声明嵌套

  5、成员变量没有写在括号里面

  6、方法的声明写在了大括号里面

方法和函数的区别

方法:

1、方法都是以减号开头的

2、方法声明必须写在@interface和@end之间

方法定义必须写在@implementation和@end之间

3、方法只能由对象来调用

4、方法归对象/类所有

函数:

1、函数归文件所有,能写在除#interface和@end之间的任意位置

2、函数调用不依赖与对象

类的简单设计

 #import <Foundation/Foundation.h>
/*
学生类:
狗类
*/ //性别
typedef enum
{
SexMan,//男
SexWoman//女
} Sex;
//生日
typedef struct
{
int year;//年
int month;//月
int day;//日
} Date;
//颜色
typedef enum
{
ColorBlack,//黑色
ColorRed,//红色
ColorGreen//绿色
} Color; //类的声明:狗
@interface Dog : NSObject
{
@public
double weight;//体重
Color curColor;//毛色
}
//方法声明
- (void) eat;//吃
- (void) run;//走 @end @implementation Dog //方法实现
- (void) eat
{
weight += ;
NSLog(@"狗吃过体重是%f",weight);
} - (void) run
{
weight -= ;
NSLog(@"狗溜过体重是%f",weight);
} @end //类的声明 :学生
@interface Student : NSObject
{
@public
Sex sex;//性别
Date birthday;//生日
double weight;//体重
Color FavColor;//最喜欢的颜色
char *name;//姓名
//狗,对象中对象,指针
Dog *dog;//OC中得其他对象必须是指针
}
//方法声明
- (void) eat;//吃
- (void) run;//走
- (void) print;//输出
- (void) walkingDog;//遛狗
- (void) feadDog;//喂狗
@end //类的实现
@implementation Student
//方法实现
- (void) eat
{
weight += ;
NSLog(@"吃过体重是%f",weight);
} - (void) run
{
weight -= ;
NSLog(@"运动过体重是%f",weight);
} - (void) print
{
NSLog(@"Sex is %d,birthday is %d-%d-%d,favourate color is %d",sex,birthday.year,birthday.month,birthday.day,FavColor); } - (void) walkingDog
{
[dog run];
}
- (void) feadDog
{
[dog eat];
}
@end int main()
{
Student *pStu = [Student new];//新建对象
pStu->dog = [Dog new];//新建狗对象
pStu->dog->weight = ;//狗的体重
pStu->dog->curColor = ColorBlack;//狗的颜色
pStu->weight = ;//学生体重 pStu->sex = SexMan;//学生性别 Date d = {,,};//学生年龄
pStu->birthday = d;//赋值 pStu->FavColor = ColorGreen;//学生最喜欢的颜色 pStu->name = "ZhangSan";//学生姓名 [pStu eat];//调用方法eat
[pStu eat];//调用方法eat
[pStu run];//调用方法run [pStu print];//调用方法print
[pStu walkingDog];//调用方法
[pStu feadDog];//调用方法feadDog
return ;
}

方法的参数

oc方法中,一个参数对应一个冒号。

- (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号. 方法名是pingfang: 包括后面的冒号。

- (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数。方法名是:SumwithNum1:andNum2:

 #import <Foundation/Foundation.h>

 /*
计算器类:
返回数值n
计算平方
计算和
*/ @interface JiSuanQi : NSObject -(double) pi;
//方法名是 pingfang:
- (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号
//- (int) Sum:(int)a :(int)b;
//方法名是:SumwithNum1:andNum2:
- (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数
@end @implementation JiSuanQi
- (double) pi
{
return 3.14;
}
- (int) pingfang:(int)num//oc方法中,一个参数对应一个冒号
{
return num * num;
}
- (int) SumwithNum1:(int)num1 andNum2:(int)num2
{
return num1 + num2;
}
@end int main()
{
JiSuanQi *p = [JiSuanQi new];//新建对象
double d= [p pi];//调用pi方法
NSLog(@"%f",d);
int n = [p pingfang:];//调用平方方法
NSLog(@"%d",n);
//这样写比较好理解
int sum = [p SumwithNum1: andNum2:];//调用方法sum
NSLog(@"%d",sum);
return ;
}

练习2:

 /*

方法:比较车速
*/ //
@interface Car : NSObject
{
@public
int speed;
}
- (int) comapreSpeedWithOther:(Car *)other; @end @implementation Car
- (int) comapreSpeedWithOther:(Car *)other
{
return speed - other->speed;
} @end int main()
{
Car *p1 = [Car new];
Car *p2 = [Car new];
p1->speed = ;
p2->speed = ;
int res = [p1 comapreSpeedWithOther:p2];
NSLog(@"%d",res);
return ;
}

匿名对象的使用

[Car new]->speed = 300;//匿名对象

int main()

{

//匿名对象,不要这样写,会造成内存泄露

[Car new]->speed = 300;

//不要这样写,会造成内存泄露

[[Car new] run];

return 0;

}

Xcode文档安装

1、直接找到Xcode文件路径,把离线文件复制进去

  /Applications/Xcode.app/Contents/Developer/Documentation/DocSets

2、放到硬盘某路径下

  /Users/用户名/Library/Developer/Shared/Documentation/DocSets

IOS开发学习笔记009-OC基本知识的更多相关文章

  1. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  2. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  3. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

  4. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  5. IOS开发学习笔记016-Foundation框架

     Foundation 框架的学习 一.Foundation 常用结构体 1.NSRange(location,length)  typedef struct _NSRange { NSUIntege ...

  6. IOS开发学习笔记013-内存管理

    内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 6.内存管理总结 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):s ...

  7. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

  8. IOS开发学习笔记017-第一个IOS应用

    第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...

  9. IOS开发学习笔记014-ARC机制

    ARC 1.ARC机制 2.ARC 判断准则 3.注意事项 4.ARC和非ARC混合使用 ARC机制 ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器.因此 AR ...

随机推荐

  1. zabbix-3.4 触发器

    3 触发器 概述 触发器是"评估"由项目采集的数据并表示当前系统状况的逻辑表达式. 当监控项用于采集系统的数据时,始终遵循这些数据是非常不切合实际的,因为这些数据始终在等待一个令人 ...

  2. 聊聊javascript的事件

    javascript事件1.点击事件 onclick    obtn.click=function(){};2.移入/移出事件 onmouseover/onmouseout 注意:在父级中移入移出,进 ...

  3. shrio中去掉 login;JSESSIONID

    shrio中去掉 login;JSESSIONID 在session管理器配置页面中新增一条记录

  4. 无效的 JSON 基元 解决办法

    在AJAX中进行如下修改: 加入: dataType: "json", 移除: contentType: 'application/json', 然后检查参数名称,类型是否符合后台 ...

  5. Exception handling 异常处理的本质

    异常处理的本质:状态回滚或者状态维护. https://en.wikipedia.org/wiki/Exception_handling In general, an exception breaks ...

  6. Gym - 100676H Capital City(边强连通分量 + 树的直径)

    H. Capital City[ Color: Black ]Bahosain has become the president of Byteland, he is doing his best t ...

  7. ASP.NET补充

    字典类的子集 using System.Collections.Generic; Dictionary<string, string> dicB = new Dictionary<s ...

  8. Jquery动态添加多行,返回数据至每一行中

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="sys_channel_ed ...

  9. 移动端调试利器-vConsole

    现在移动端开发越来越火,随之而来的问题也越来越多,今天给大家介绍一款移动端调试神器,vconsole. 一.先引用文件,可以从https://www.bootcdn.cn/vConsole/下载,也可 ...

  10. java基础面试题:写clone()方法时,通常都有一行代码,是什么?

    clone()方法 与new constructor()构造器创建对象不同 是克隆一个新的对象 package com.swift; public class Clone_Test { public ...