一、基本概念

Objective-C(简称OC)是iOS开发的核心语言,苹果公司在维护,在开发过程中也会配合着使用C语言、C++,OC主要负责UI界面,C语言、C++可用于图形处理。C语言是面向过程的语言,OC是在C语言基础上加上了一层面向对象的语法(将复杂面向对象语法去掉了)。我们可以使用OC开发Mac OS X平台和IOS平台的应用程序。

2014年10月编程语言排行榜(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)

从这个排行榜上可以看到,高居榜首的还是c、java、object-c、c++、c#、php、python、javascript.

注意:

1、Objective-C是没有包的概念的,也就是没有命名空间机制,而是通过给类名添加前缀来防止类名冲突。

2、Objective-C中的关键字以@开头,防止和c/c++的关键字冲突。

3、Objective-C中的字符串以@开头。

语法:

需要注意的是上面的红色字部分:

BOOL类型(YES\NO)其实就是1和0

nil相当于Java中的null

self相当于Java中的this

for(xx in xx)和javascript的快速遍历相同,相当于java中的for...each

继承和Java相同是单继承

二、第一个OC程序

选择命令行程序
选择语言位Objective-C,创建好的工程如下:
//
// main.m
// firstOCProj
//
// Created by lixiaoqiang on 14/11/11.
// Copyright (c) 2014年 lixiaoqiang. All rights reserved.
// #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}

控制台输出:

2014-11-11 23:44:36.052 firstOCProj[1649:99047] Hello, World!

上面的@autoreleasepool和内存管理有关,暂时不用管。

#import  <Foundation/Foundation.h> : import和include的作用一样,唯一区别是可以防止头文件被重复包含。
NSLog():向控制台输出日志,相当于c语言中的printf(),和android中的Log

三、类的基本语法

OC中的类分为两个文件,一个是.h文件,另一个是.m文件(是OC文件的后缀名)
.h : 类的声明文件,用于声明成员变量和方法。
.m : 实现.h中声明的方法。
新建Student.h和Student.m文件,工程如下:
Student.h文件
//
// Student.h
// firstOCProj
//
// Created by lixiaoqiang on 14/11/11.
// Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//
//该文件只是用来声明Student这个类有哪些成员变量和方法 //包含NSObject所在的头文件
#import <Foundation/Foundation.h>
//@interface @end代表声明一个类
//和Java不同的是OC中不能省略NSObject的默认继承
// : 代表继承
@interface Student : NSObject{
//定义成员变量(必须定义在该括号内)
int age;
} //age的get方法
//如果是动态方法 -
//如果是静态方法 + (-和+必须添加)
//OC中的参数类型都用括号括住
//.h文件中的方法都是公共方法
- (int)age; //age的set方法
//OC中一个 : 对应一个参数
- (void)setAge:(int)newAge;
@end

Student.m文件

//
// Student.m
// firstOCProj
//
// Created by lixiaoqiang on 14/11/11.
// Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//
//自定义的头文件使用双引号
#import "Student.h" @implementation Student - (int)getAge {
return age; //age在父类中
} - (void)setAge:(int)newAge {
age = newAge;
} @end

main.m文件

//
// main.m
// firstOCProj
//
// Created by lixiaoqiang on 14/11/11.
// Copyright (c) 2014年 lixiaoqiang. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Student.h" int main(int argc, const char * argv[]) {
@autoreleasepool { //创建一个Student对象
//1、调用一个静态方法alloc分配内存
//OC 中通过类名调用方法 [类名 方法名]
//[Student alloc]返回一个指针,在OC中stu称为对象
//这个其实和Java中的对象(this)是一样的(引用)
//Student *stu = [Student alloc];
//2、调用一个动态方法init进行初始化
//stu = [stu init]; //连接起来使用
Student *stu = [[Student alloc] init];
[stu setAge:100];
NSLog(@"调用了setAge方法");
int age = [stu age];
NSLog(@"Student的age是%i", age);
//释放对象
//[stu release];
}
return 0;
}

运行结果:

2014-11-12 00:25:03.661 firstOCProj[1707:110472] 调用了setAge方法

2014-11-12 00:25:03.663 firstOCProj[1707:110472] Student的age是100

四、点语法

#import <Foundation/Foundation.h>

@interface Person : NSObject{
int _age;
int _no;
} - (void)setAge:(int)newAge;
- (int)age; //注意: 方法名是setAge:andNo:
- (void)setAge:(int)newAge AndNo:(int)no; @end
#import "Person.h"

@implementation Person

//方法名是setAge:  (冒号也是方法名的一部分)
- (void)setAge:(int)newAge {
NSLog(@"调用了setAge方法:%i", newAge);
_age = newAge;
} //方法名是age
- (int)age {
NSLog(@"调用了age方法");
return _age;
} @end

在Person类的实现里面我们分别打印了两个log用来判断是否调用了该方法

#import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init]; //方法一:
//[person setAge:10];
//int age = [person age]; //方法二:(点语法)
//OC中调用的成员方法,等效于[person age]
person.age = 11;
//等效于[person setAge:11]
int age = person.age; NSLog(@"age is %i", age);
}
return 0;
}

输出结果:

2014-11-12 20:03:55.718 firstOCProj[521:19414] 调用了setAge方法:11

2014-11-12 20:03:55.719 firstOCProj[521:19414] 调用了age方法

2014-11-12 20:03:55.720 firstOCProj[521:19414] age is 11

可以看到在OC中的点语法和Java中是不一样的,person.age调用的是成员方法而不是变量。

五、构造方法和%@
//
// Person.m
// firstOCProj
//
// Created by lixiaoqiang on 14/11/12.
// Copyright (c) 2014年 lixiaoqiang. All rights reserved.
// #import "Person.h" @implementation Person - (void)setAge:(int)age {
_age = age;
} - (int)age {
return _age;
} - (void)setNo:(int)no {
_no = no;
} - (int)no {
return _no;
} //实现构造方法 - (id)initWithAge:(int)age andNo:(int)no {
//首先要调用super的构造方法
if(self = [super init]){ //如果self不为nil
self.age = age;
self.no = no;
}
return self;
} // 重写父类的description方法
// 当使用%@打印一个对象的时候会调用
// NSString 是一个字符串类
- (NSString *)description {
return [NSString stringWithFormat:@"age is %i and no is %i", _age, _no];
} @end
//
// main.m
// firstOCProj
//
// Created by lixiaoqiang on 14/11/11.
// Copyright (c) 2014年 lixiaoqiang. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] initWithAge:15 andNo:2]; NSLog(@"age is %i and no is %i", person.age, person.no); //%@代表打印一个OC对象
NSLog(@"%@", person);
}
return 0;
}

Objective-C基础笔记(1)基本概念和第一个程序的更多相关文章

  1. 【matlab 基础篇 01】快速开始第一个程序(详细图文+文末资源)

    快速入门matlab,系统地整理一遍,如何你和我一样是一个新手,那么此文很适合你: 文章目录 1 软件安装 2 打开软件 3 编写程序 3.1 基础步骤 3.2 添加PATH 3.3 命令行模式 4 ...

  2. Python 学习笔记(六)Python第一个程序

    Python 语句 赋值语句 1.将3对象赋值给了变量a 2.将3,4赋值给了变量a,b >>> a = 3 >>> a ,b = 3,4 >>> ...

  3. Python基础—01-认识python,编写第一个程序

    认识python 发展历史:点此查看简介 就业方向: WEB.爬虫.运维.数据分析.机器学习.人工智能.... 版本选择 python2.7是最后一个py2的版本,2020年将不再提供支持 pytho ...

  4. php代码审计基础笔记

    出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...

  5. MYSQL基础笔记(一)

    关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...

  6. C#基础笔记 转自wojiushigelg

    笔记如下: 概念:.net与c# .net/dontnet:一般指.net framework框架,一种平台,一种技术 c#(charp):一种编程语言,可以开发基于.net的应用. *java既是一 ...

  7. HTML5基础——笔记

    HTML5基础——笔记 近几年来,互联网+.大数据.云计算‘物联网‘虚拟现实‘人工智能.机器学习.移动互联网等IT相关新名词.新概念层出不穷,相关产业发展如火如荼.互联网+移动互联网已经深入到人民日常 ...

  8. 数据结构-浙大 MOOC 笔记一 基本概念

    做一些笔记记录自己的学习过程 第一节课介绍了数据结构的基本概念,首先没有直接给出相关的定义而是通过思考如何在书架上摆放书籍这样一个简单的类比了解到数据的组织方式的重要性,并通过printN函数的循环实 ...

  9. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

随机推荐

  1. Android笔记三十四.Service综合实例二

    综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName ...

  2. Sqlite 命令行导出、导入数据(直接支持CSV)

    打开命令行 导出数据到data.csv D:\project>sqlite3.exe old.db SQLite version 3.21.0 2017-10-24 18:55:49 Enter ...

  3. kafka查询topic属性含义

    第一行,列出了topic的名称,分区数(PartitionCount),副本数(ReplicationFactor)以及其他的配置(Config.s) Leader:1 表示为做为读写的broker的 ...

  4. netflix zuul 1.x与zuul2.x之比较

    1.zuul 1.x的架构如下所示: 线程模型: 其web应用的web.xml <?xml version="1.0" encoding="UTF-8"? ...

  5. 洛谷P1586 四方定理

    题目描述 四方定理是众所周知的:任意一个正整数nn ,可以分解为不超过四个整数的平方和.例如:25=1^{2}+2^{2}+2^{2}+4^{2}25=12+22+22+42 ,当然还有其他的分解方案 ...

  6. Aspose.Cells相应操作及下载

    Aspose.Cells相应操作 1,上传 1.1 Workbook Workbook workBook = new Workbook(); 属性: 名称 值类型 说明 Colors Color[] ...

  7. noip 2018 day1 T3 赛道修建 贪心_树上问题_multiset

    Code: // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; #define maxn 5000 ...

  8. Flex之柱状图实例

    Flex之柱状图实例 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns ...

  9. 使用js实现简单放大镜的效果

    实现原理:使用2个div,里面分别放大图片和小图片,在小图片上应该还有一个遮罩层,通过定位遮罩层的位置来定位大图片的相对位置,而且,遮罩层的移动应该和大图片的移动方向相反 关键: 大图片和小图片大小比 ...

  10. 代码正常,junit却报错原因及解决方法

    junit测试,不能有参数 和static,去掉static测试正常;