"OC基础"这个分类的文章是我在自学Stephen G.Kochan的《Objective-C程序设计第6版》过程中的笔记。

1、  函数和方法的区别?

(1)、方法包含在类内部,而函数不用包含在类里面;

(2)、方法就是函数的一种。

2、数组中某个元素的读法,比如grades [5]读作“grades sub 5”。

3、关于C语言的数组元素的初始化:

(1)、直接列出所有元素的值,比如:

int integer[5] = {1, 2, 3, 4, 5};

char letters[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};

(2)、如果只指定了较少的初始化值,那么只会初始化等量的元素,比如:

float s_data[500] = {100.0, 143.00, 45.50};

那么数组中的前三个元素会被初始化成100.0, 143.00, 45.50,其他元素被设为0;

(3)、可以直接指定某个元素的值,比如:

int x = 1233;

int a[] = {[9]=x+1, [2]=3};

在这个例子中,直接指定了编号为9的元素的值为1234,指定了编号为2的值为3。同时这个数组没有指定大小,编译器会根据数组内容里出现了[9]将数组的大小定为10。

4、关于C语言的字符数组:

如果有一个字符数组定义如下:

char word[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘!’, ‘\0’};

这个数组的大小会自动被定为7,‘\0’是终止空字符,有了这个符号之后,可以使用NSLog方法打印这个数组,打印成字符串的格式,语句如下:

NSLog(@’%s’, word);

’%s’表示NSLog会持续地显示字符,直到遇见‘\0’才终止。而后面要打印的内容只需要写上数组的名称,不需要方括号

5、关于C语言的多维数组:

(1)、多维数组的声明方法如下:

int M[4][5];

这个语句定义了一个4行5列总共20个元素的多维数组,每一个元素都包含一个整型值;

(2)、多维数组的初始化可以直接列出数组的所有元素:

int M[2][4] = {

{10,5,6,3},

{34,23,1,20}

}

这里需要注意,除了最后一行,每一行结束都要使用逗号分开

(3)、如果要列出数组所有元素的方法来初始化多维数组,其实可以不用花括号:

int M[2][4] = {10,5,6,3,34,23,1,20}

编译器会自动匹配;

(4)、也可以不用初始化整个多维数组:

int M[2][4]{

{1,2},

{3,4}

}

这样会初始化每行的前两个元素,其余值都会被设为0。这种情况下一定要使用内层花括号。

6、如果没有声明函数的返回类型,编译器会假设返回类型为整型;如果方法没有指定返回类型,编译器会假设返回类型为id类型

7、如果函数的参数数目不确定,那么可以使用省略号来做形参,比如:

void NSLog(NSString *format, ...);

那么在参数NSString *format后面,就可以是任意数目的附加参数。注意省略号只有三个点。

这里指的是NSLog函数的定义,NSLog函数确实是参数数目不确定的,有时输出一个值,有时输出多个值。

8、静态函数:

默认情况下,函数是外部的。即是所有和该函数链接在一起的文件中的所有函数和方法都可以调用这个函数。如果使用static关键字将其定义为静态函数,可以限制它的作用域:

static int gcd(int u, int v){

...

}

静态函数则只有和这个函数在同一个文件的函数或者方法可以访问它。

9、如果要向某个函数传递数组里的第i个元素作为参数,那么直接使用以下方式即可:

fx( xArray[i] )

如果要传递整个数组作为参数,那么只需要在调用写出数组的名称,不需要任何下标

fx( xArray )

10、如果在函数或方法中改变了作为参数的数组元素的值,那么这个变化会确实地影响到这个数组本身,不论函数或方法是否已调用完成。因为函数或方法使用数组做参数时,传递给形参的并不是整个数组本身,而是传递一个指针,它指向数组所在的地址。所以对形参所做的更改其实都是指向原始数组本身的修改。

11、块的基本模板:

void (^callName) (int) = ^(int n) {

  NSLog(@”%i”, n);

};

需要注意的地方如下:

(1)、第一个void是这个块的返回类型;

(2)、callName是这个块赋给的变量名称,在定义了这个块之后,使用callName(2);这样的格式就可以调用这个块;

(3)、等号前的(int)是这个块的参数列表,等号后的(int n)是形参,同时形参也有“^”这个符号;

(4)、块的最后要以分号结尾。

(5)、调用(^callName)的语句应该是:“callName();”,注意是有括号的。

12、块定义在函数或者方法内部,能够访问在函数或方法块之的任何变量。块能够访问但是不能改变这些变量的值,除非使用在块前面含有两个下划线的块修改器。

13、块能够作为参数传递给方法或函数。

14、一个例子:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {

autoreleasepool {

int foo = 10;

void (^printFoo) (void) = ^(void){

NSLog(@”Foo is %i”, foo);

};

foo = 15;

printFoo();

}

return 0;

}

这个例子的输出结果是foo=10。首先把foo赋值为10,然后定义了块(^printFoo),最后再把foo赋值为15。这时候调用(^printFoo),发现出来的结果foo还是10。

说明块内包含的变量的值在块定义的时候就确定了,块在使用到块外部的变量的时候会将变量复制一份来使用,所以在定义完块后再去变动变量的值不会影响到块内的变量的值。一般来说,在块内部不允许修改变量的值,编译器会报错。

15、一个例子:

#import <Foundation/Foundation.h>

int main(int arvc, char *arvg[]){

autoreleasepool{

__block int foo = 10;    //此处为(1)

void (^printFoo) (void) = ^(void){

NSLog(@”foo = %i”, foo);

foo = 20;            //此处为(2)

}

foo = 15;

printFoo();

NSLog(@”foo = %i”, foo);

}

return 0;

}

首先这个例子如果在(1)这个地方不插入“__block”的话,那么在(2)这个地方就会报错,因为在块内部不允许修改变量的值,如果要修改的话必须在定义这个变量的时候使用在块前面含有两个下划线的块修改器。

这个例子的输出结果是:

foo = 15

foo = 20

由于定义了“__block”,那么foo的值的修改就会影响到块了。首先定义foo的值为10,程序经过块的时候,foo被修改为20,然后在块完结之后,foo被指定为了15。这时候调用printFoo,出来的值就是foo=15,同时在打印为foo=15之后,快内部的代码继续走下去,把foo置为了20。最后使用NSLog函数打印出来的就是foo=20了。

另外需要注意,“__block”是由两个下划线和block组成的,它们之间没有空格

16、一个简单的结构

struct date{

int month;

int day;

int year;

};

关于这个结构:

(1)、定义结构必须以分号结尾;(和块一样)

(2)、这个结构的类型是“struct date”而不是“date”,应该这样声明这个类型的变量:

struct date today;

(3)、设置或读取today里面的day的值为1的话,要使用点运算符:

 today.day = 1;

17、结构的初始化方式:

(1)、直接列出所有元素的值:

struct date today = {2, 1, 2015};

(2)、使用点运算符可以任意顺序或者部分赋值来初始化:

struct date today = { .year=2015, .month=2};

18、可以使用typedef来使结构的类型名称更简略,比如定义了某个结构类型struct CGPoint,那么可以:

typedef struct CGPoint CGPoint;

即是用CGPoint来替代struct CGPoint,那么定义结构的时候就可以用以下语句:

CGPoint myPoint;

这里要注意,在声明结构的时候不需要使用*;在声明对象的时候(比如Fraction *frac)才需要用到*号。声明了结构之后,就可以使用点运算符来操作结构内部的元素了。

OC基础10:基本的C语言特性1的更多相关文章

  1. OC基础(10)

    id类型 SEL类型 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !im ...

  2. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  3. OC基础11:基本的C语言特性2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...

  4. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  5. 浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  6. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

  7. 3-0 js基础 语言特性及性能优化

    1.语言特性: 内存泄露:内存没有释放,越堆越多. 垃圾回收(生命周期): 1.局部 很短 在局部中当函数完成时.已经释放了.全局变量在页面关闭的时候才被回收. 2.全局 很长 3.闭包.可长可短,只 ...

  8. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  9. C++ 语言特性的性能分析

    转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html      大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...

随机推荐

  1. Contains Duplicate 解答

    Question Given an array of integers, find if the array contains any duplicates. Your function should ...

  2. Binary Tree Level Order Traversal 解答

    Question Given a binary tree, return the level order traversal of its nodes' values. (ie, from left ...

  3. LeeCode-Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  4. Unity position和localposition

    1. position是根据世界原点为中心 2. localPosition是根据父节点为中心,如果没有父节点,localpositon和position是没有区别的 3.选中一个物体左上角Globa ...

  5. Beauty of Array(模拟)

    M - M Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status P ...

  6. ZendStudio快捷键 注释的快捷键

    注:本文省略“通用快捷键”描述,诸如:ctrl+N=新建,ctrl+O=打开,ctrl+C=复制,ctrl+V,ctrl+X……等等几乎所有软件都通用的一组快捷键,而着重介绍zde独有的快捷键,了解并 ...

  7. Oracle SQL函数之数学函数

    Oracle SQL函数之数学函数 ABS(x) [功能]返回x的绝对值 [参数]x,数字型表达式 [返回]数字 SQL> SELECT ABS(),ABS(-) FROM DUAL; ABS( ...

  8. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...

  9. window服务创建

    第一步:创建服务 第二步:在Service1.cs视图中 右键 选择”添加安装程序” 这里要注意几个细节 设置上面的属性 这两个分别有属性,具体网上查使用方式 3 实例代码编写 主要下面几个方法 pr ...

  10. css之background的cover和contain的缩放背景图

    对于这两个属性,官网是这样解释的: contain 此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小. 等比例缩放图象到垂直或者水平其中一项填满区域. cover 此时会保持图像的纵横 ...