Objective-C的入门学习笔记

对于一门语言得学习,个人觉得最主要得就是其语法格式和那些关键字。

因为对于基本现在大多数得语言,每种语言都是一种符合人思维得方式来与计算机交流。

因此,其实每种语言中定义或是封装好得基础类和类库,其实都是很相似得。

比如 int,double几种基本类型,String,数组,集合以及字典数据类型。

因此你在编程时比如你想以字符串形式和计算机交流,那你很容易就能想到在C中可以使用String这个类,在java中也是Stirng

(当然,前提是你至少有一种同抽象级别得语言基础),那OC呢,也有这样一个类吧,不过是某种原因加了个前缀。

那么对于类中定义函数得使用,可能不同语言就有所不同了,首先是函数名(这个其实基本不担心,现在得ide工具提示太强悍了,真不行你可以文档),

其次就是函数得调用格式,我这简单理解为语法格式得一种。

一、语法概览

1.首先一个类的组成

这个知道C的基本没什么说的 .h和.m文件。一个是头文件,一个是实体文件。

OC中一般说是申明文件和实现文件

简单来说,h文件就是整体对一个类得描述,m文件是对h文件中申明描述得实现

代码如下:

// 
//  NonoAppDelegate.h 
//  MultiViews 
// 
//  Created by Nono on 12-4-19. 
//  Copyright (c) 2012年 NonoWithLilith. All rights reserved. 
// 
 
#import <UIKit/UIKit.h> 
 
@interface NonoAppDelegate : UIResponder <UIApplicationDelegate,UITabBarControllerDelegate> 

    UITabBarController *tabBarController; 
    UIWindow *window; 
 

 
@property (retain, nonatomic)IBOutlet UIWindow *window; 
@property (retain, nonatomic)IBOutlet UITabBarController *tabBarController; 
@end

2.来看头文件得格式和申明

#import这个关键字没啥说的,java中叫导入。就是引入你当前类所要用到得依赖库和类。

@interface 申明开头关键字。 后面紧跟的是定义额类名  :后面的是继承得类 UIResponder ,< xxxxxxxxx>有点类似于java中得接口,当然 OC中有个

更加准确得定义就叫协议 ,<>放协议类。 整个申明最后都以@end结束。

{ }里面就是常说得申明成员变量。

@property 属性,我暂时理解为也有点成员变量的意思。 这个属性更多是和后面得m文件中的的synthesize关键字有密切联系。

(retain ,nonatomic)属性的一些参数。这个具体可以去看文档,估计C语言额同学应该不陌生,我不是很明确每个参数比较适合得场合。

IBOutlet 关键字,这个是和nib文件息息相关得,只要在nib文件中需要关联的对象,用这个修饰(比如我nib文件中有个window控件,要和代码中这个对象联系起来

,那么就用这个关键字申明),申明完后会看到这段代码最左端有个空心圆圈,当你和nib文件中控件关联后,就实心圆圈了。

代码如下:

// 
//  NonoAppDelegate.m 
//  MultiViews 
// 
//  Created by Nono on 12-4-19. 
//  Copyright (c) 2012年 NonoWithLilith. All rights reserved. 
// 
 
#import "NonoAppDelegate.h" 
 
@implementation NonoAppDelegate 
 
@synthesize window; 
@synthesize tabBarController; 
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

  //  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
   // self.window.backgroundColor = [UIColor whiteColor]; 
    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 
    return YES; 

@end

3.实现文件

implmentationxxx    @end。这个不用说了吧。

@synthesize 这个关键字有点意思。这个关键字得表示法后,编译器就自动隐式生成一个setter和getter,OC上得说法来说就是自动实现一个

存取方式。然后我们知道,oc语言这个习惯方式,一个方法和属性在使用前都必须有个申明,就是 h和m文件这个构造啦。那对于h头文件中property

我们是不是可以理解,这是对编译器得一个申明,我将在实现文件中实现这个对象得存取方法,而在m实现时只不过我们一个关键字后让编译器去做了这个事。

4.例子最后说下OC中对象得方法得调用

比如在java中我要调用 a对象的functionA()方法,直接用得点表示法  a.functionA();

在OC中有点奇特表示成 [a  functionA],如果方法呀传参数,那么紧跟着 functionA :obj

二、关键字
1.NS前缀。OC得大部分类都有这个前缀。要理解缘由,可以去看OC得历史。

2.Bool 这个数据类型有点改动,在常见得语言中都是true和false,OC是YES和NO。

3.@protocol关键字,这个是申明协议类时,和@end连用,看字面意识就知道了。

对于协议我们上面提到,有点类似于java中得接口,当众所周知,接口中申明得方法必须全部实现。java中当然对这样一个强自行手段有引申出

抽象abstract这个类来对这种强制手段一个缓和,OC中则直接在协议类中申明了这一点,对于有些方法不需要强制实现,可选得,用了optional。

这个你可以具体随意跳入哟个协议类看就好了,相信在以后更多代码接触后会有个更深得理解。

4.对于刚接触oc语言得人可能有个小疑惑得类型 (id),这个可以理解为java语言中得泛型。

三、OOP思想

面向对象这个概念性东西大家应该都有。

什么继承,封装,多态这些就跟背单词一样。但是,简单的还是需要用大白话能说出来的。

先说封装:封装我觉得其实是oop思想最原始的一个基础。封装的引入后,才能衍生出对象这一概念。我们把一个物体和它拥有的属性和更能包装起来,是一个抽离然后融合的过程。

继承:继承从字面句很好了解,儿子继承父亲。一个物体派生出一个新的物体。当然,继承后的很多特性,你可以背书去。

多态:多态其实更好解释了,听字面,多种形态?一个事物的多种实现(当然,这个可能很直观很字面,但是从严谨性上来说是错误的)因为一个物体的多种实现,怎么

看怎么听都是像继承啊,比如我有个鱼类,那么我可以派生一个鲨鱼类和一个鲸鱼类,那对于这个做法来说,感觉是继承啊。其实他们的本质思想都是差不多的,

只是侧重点的不同。继承更像表达一个物体派生一个新物体,多态则是一个物体派生出多个物体对改物体的不同实现,这个实现最直接的方式就是对超类中方法的不同的覆写和实现。比如鱼类,有个eat()方法,派生的鲨鱼类,我们都知道鲨鱼吃肉,那么我们可以实现鲨鱼的eat方法是吃肉的,蓝鲸我们算他杂食吧,那么蓝鲸的eat方法则是实现杂食吃法。此时你就可以站在一个全面的角度简单的看到多态这个概念了。

对于深入理解OOP这个思想定义,其实就类似于看你对待事物抽象的高度。

四、新事物的或者说一个新类产生的集中方式

1.最原始得一种,就是我们自己抽象定义除一个类。比如定义最原始的类,在java和OC中都存在这样一个原始类Object。

2.继承而来派生出一个新类。这个很好理解。比如从人类Human衍生出男人类 Man,

3.还有一种是我们比较少明确意识到,但是其实是很常用到方法:复合,既用几个不同的类来复合成一个新类。最常用就以书上例子解释 ,Car 汽车类,

简单我们可以用Engine引擎和Tires轮子来构造成最简单的Car模型。

五、OC中类别和非正式协议概念

1.category,类别应该算是OC独有的一个术语,书上给类别的定义是:一种为现有类添加新方法的一种方式。

其实这个方式怎么听怎么像创建子类就可以做到的概念。

是的,为一个类做扩展,我们最常想到的方法就是为其创建一个子类,然后添加你需要扩展的新方法等。

但是在OC中有时这样并不方便,书上举例了一个NSString的例子。原话是这样的:

/**********

当希望为新有类添加新的行为时,我们通常会创建子类。

但是有时子类并不方便。例如,你可能会希望为NSString类新增一些新行为,但是你知道,NSString实际上只是一个类簇的前台表示,因而无法

为这样的类创建子类。省略1000字。

********/

好了,从上面我们基本知道,创建子类这个方法是有局限性的对吧。上面引入一个概念叫类簇。

字面意思(一簇鲜花,就是许多朵花扎成一束呈现出来,里面的具体其实我们是不知道的。)

类簇其实也算是个不大不小的概念。集体可以看官方文档 http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_9.html

鄙人也是新接触这玩意儿,里面有这么一句话:

/*****

类簇将一些私有的、具体的子类组合在一个公共的、抽象的超类下面。

****/

我不知道是不是可以理解。类簇包含的成分是带有私有性质的,但我们都知道,继承后的子类是不能访问父类的私有成员的(这个应该没错吧?)

那么我们在新创建的子类添加的新方法就无权限访问那些东西咯。

好吧,以上是个人理解,这东西也是听拗口的,具体详情可以参考更多官方文档。

那么,好了,我们大体上知道OC引入类别这个机制的原因了。配合上OC动态运行时的分配机制,你可以为现有类添加新的方法,嘿,这

听起来很酷!(书上原话)

类别创建:

代码如下:

@interface  NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end//NumberConvenience

声明有两个特点:
     (1)现有的类位于@interface关键字之后,其后是位于圆括号中的类别名称。类别名称是NumberConvenience,而且该类别将向NSString类中添加方法。换句话说:“我们向NSString类中添加一个名称为NumberConvenience的类别。”同名类别有唯一性,但是可以添加任意多的不同名类别。
     (2)可以执行希望向其添加类别的类以及类别的名称,还可以列出添加的方法
        不可以添加新的实例变量,类别生命中没有实例变量部分。

类别的实现基本和一般类的实现一样。

非正式协议和委托:非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。

这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。

这么看,总觉得类别这玩意儿有点像协议的可选协议。

可选协议只不过是有先见之明,类别是后期补救。共同一点时,对于方法实现都是可选的。可选协议有关键optionnal申明了,类别则你像高效方法你就申明,

不想就算了。

之后是委托,算OC中一个很重量级的概念。据说深入后会发现很多东西,主要鄙人目前还只接触几天,对于它在oc中整体的设计模式理论还是不太了解。

只是在写例子代码时,怎么看怎么觉得就如java中的监听和回调。可能要更好的理解,那还是要更多的接触代码才能会有个深刻的理解。

六、内存管理的改变

只所以说内存管理的改变,是以前一直说c和c++成员的在工作中最需要注意的问题就是内存管理。

在接触ios5.1前,网上看了大部分资料,内存管理都有很重要的戏份。

只是,当我学习时,发现,这块被淡化了。

现在版本的新特性引入了ARC机制。感觉完全变的和java一样了。

在创建项目选者ARC选项后,你会发现在代码中你根本不用手动去释放内存了。release什么都被划掉了 = =。

(0)

相关推荐

  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift 文件可以在一个工程中并存,不管这个工程原本是基于 Objective-C 还是 Swift.你可以直接往现有工程中简单地添加另一种语言的源文件.这种自

  • Objective-C中字符串的拼接方法小结

    在 java 和 c# 中,字符串的拼接是直接用 + 来操作的.在 OC 中,说是有下面3种方法, NSString* string; // 结果字符串 NSString* string1, string2; //已存在的字符串,需要将string1和string2连接起来   方法1: 复制代码 代码如下: string = [NSString initWithFormat:@"%@,%@", string1, string2 ]; 方法2: 复制代码 代码如下: string =

  • Swift能代替Objective-C吗?

    我文章的中心是,以 Apple 目前给出的各种资料来看,这语言不会替代掉ObjC,它不是下一代的ObjC.它有很多缺点,使得它不足以做大型项目.这些缺点使得,Apple 自己都没有使用它做 Mac/iOS 的 app.我不排除明年后年它有很大改进,但至少现在还没有这端倪. 因此,如果你会ObjC,你不需要去看它. 但你如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是 Apple 在 WWDC 向全世界推出的重磅语言我怎麽能说它不重要? 它降低了入门的门槛.使得大量的

  • objective-c中生成随机数的方法

    本文简述objective-c中生成随机数的几种常见的方法,分享给大家,希望能给大家带来一点借鉴价值.具体如下: 1).arc4random()方法:比较精确不需要生成随即种子 使用方法如下 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc4random() % x; 获取1到x之间的整数的代码如下: int value = (arc4random() % x) + 1; 2).CCRANDOM_0_1()方法:在cocos2d中使用 ,范围

  • 在Swift中使用Objective-C编写类、继承Objective-C类

    互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类.编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objective-C 的协议,还可以利用 Objective-C 的一些其它功能.这意味着,开发者可以基于 Objective-C 中已有的熟悉.可靠的类.方法和框架来创建 Swift 类,并结合 Swift 提供的现代化和更有效的语言特点对其进行优化. 继承Objective-C的类 在 Swift 中,开发者可以定义一

  • Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍

    迁移工作正好提供了一个重新审视现有 Objective-C 应用程序的机会,也可以通过 Swift 代码来更好的优化应用程序的体系架构,逻辑以及性能.直接的说,你将用先前学到的 mix and match 以及这两个语言间的互操作性来进行增量迁移工作.Mix-and-match 功能使得选择哪些特性和功能来用 Swift 来实现,哪些依然用 Objective-C 来实现变得简单.Swift 和 Objective-C 的互用性又使得将这些功能集成到 Objective-C 变得并不困难.通过这

  • Objective-C 消息传递机制详解

    Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,关于Blocks会在后续总结一下. 消息传递模型(Message Passing)是Objective-C语言的核心机制.在Objective-C中,没有方法调用这种说法,只有消息传递. 在C++或Java中调用某个类的方法,在Objective-C中是给该类发送一个消息.在C++或Java里,类与类的行为方法之间的关系非常紧密,一个方法必定属于一个类,且于编译时就已经绑定在一起,

  • Swift调用Objective-C编写的API实例

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 Cocoa 应用的方案. 互用性很重要的一点就是允许你在写 Swift 代码时使用 Objective-C 的 API 接口.当你导入一个 Objective-C 框架后,你可以使用原生的 Swift 语法实例化它的 Class 并且与之交互. 初始化 为了使用 Swift 实例化 O

  • C语言入门学习笔记之typedef简介

    在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称.和#define比较类似.但是又有不同的地方. typedef 创建的符号只能用于数据类型,不能用于值.而#define 创建的符号可以用于值. typedef 是由编译器来解释,而不是预处理器. typedef 使用起来更加灵活. 下面使用typedef定义一个数据类型 int main() { typedef unsigned char BYTE; BYTE c = 10; printf("%d \r\n&quo

  • 整理Javascript基础入门学习笔记

    了解什么是变量? 变量是用于存储信息的容器 变量的声明 语法: var  变量名 变量名 = 值; 变量要先声明再赋值 变量可以重复赋值 变量的命名规则 变量必须以字母开头: 变量也能以$和_符号开头(不过我们不推荐这么做): 变量名称对大小写敏感(a和A是不同的变量). 1.语句 语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾. 有个好的编码习惯,都要以 ; 结尾 2.数据类型 在JavaScript中,一段信息就是一个值(value).值有不同的类型,大家最熟悉的类型是数字.字符

  • Lua入门学习笔记

    最近在使用Cocos2d-x + Lua来开发游戏. 游戏的主要逻辑将在Lua里写,之前没有接触过Lua,以下是我总结的入门笔记. 运算符 逻辑运算符 与:and 或:or 非:not 逻辑判断只有在false和nil时为假,其余均为真. or和and会返回第一个断路的值. Lua中没有C语言的三元符(x ? a : b),但有一个替代方案(x and a) or b. 需要注意的是,以上方案在x为true,a为false,b为true的情况下与三元符的结果是相反的. 关系运算符 不等于:~=

  • python基础入门学习笔记(Python环境搭建)

    Python学习第一篇.把之前学习的Python基础知识总结一下. 一.认识Python 首先我们得清楚这个:Python这个名字是从Monty Python借鉴过来的,而不是源于大家所知道的大蟒蛇的意思.我们为什么要学习Python呢?就我而言,我知道豆瓣在使用.重视Python,加上我想学习网页爬虫技术,所以,我要学习Python编程.另外在国外,Yahoo和Google都在使用Python.那么,Python就很值得我们认真学习. 二.Hello,World! 首先我们需要安装Python

  • Objective-C的入门学习笔记

    对于一门语言得学习,个人觉得最主要得就是其语法格式和那些关键字. 因为对于基本现在大多数得语言,每种语言都是一种符合人思维得方式来与计算机交流. 因此,其实每种语言中定义或是封装好得基础类和类库,其实都是很相似得. 比如 int,double几种基本类型,String,数组,集合以及字典数据类型. 因此你在编程时比如你想以字符串形式和计算机交流,那你很容易就能想到在C中可以使用String这个类,在java中也是Stirng (当然,前提是你至少有一种同抽象级别得语言基础),那OC呢,也有这样一

  • Android Binder入门学习笔记

    写在前面 Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Binder机制的.当然了,Binder机制的底层驱动实现很复杂,本文的目的只是为了理清Binder的使用和在应用层的结构和流程,对于Binder在底层是如何实现的,目前能力还没到这一步去分析,不会涉及到.对于这部分,不妨将它看成是一个黑盒子,我们输入什么,然后底层会给我们提供什么. 代理模式 我们知道

  • Pandas Shift函数的基础入门学习笔记

    Pandas Shift函数基础 在使用Pandas的过程中,有时会遇到shift函数,今天就一起来彻底学习下.先来看看帮助文档是怎么说的: >>> import pandas >>> help(pandas.DataFrame.shift) Help on function shift in module pandas.core.frame: shift(self, periods=1, freq=None, axis=0) Shift index by desire

  • Vue入门学习笔记【基本概念、对象、过滤器、指令等】

    本文实例讲述了Vue入门基本概念与使用.分享给大家供大家参考,具体如下: 1. Vue.js是什么? 1). 一位华裔前Google工程师(尤雨溪)开发的前端js库 2). 作用: 动态构建用户界面 3). 特点: * 遵循MVVM模式 * 编码简洁, 体积小, 运行效率高, 移动/PC端开发 * 它本身只关注UI, 可以轻松引入vue插件和其它第三库开发项目 4). 与其它框架的关联: * 借鉴angular的模板和数据绑定技术 * 借鉴react的组件化和虚拟DOM技术 5). vue包含一

  • PHP入门学习笔记之一

    1. 基本语法 要在HTML代码中嵌入PHP脚本的方法是在<?php ?>中书写代码.向浏览器输出数据采用echo或者print函数.echo可以接受多个参数,print 只能接受一个.echo的形式是 void echo(string arg1,[,-string argn]); PHP语法允许省略括号. 例如, 复制代码 代码如下: <?php $my =' my '; echo 'Hello',$my,'world' ?> 将会在浏览器上输出 Hello my world P

  • json 入门学习笔记 示例代码

    Json介绍: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.      json 官方网站 http://www.json.org/      json.net 下载地址 http://json.codeplex.com/releases/view/37810 Demo: 描述: 点击获取按钮后,将请求页面,获取json数据,填充到表格html代码: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-/

随机推荐