当前位置: 首页 > 编程日记 > 正文

Objective-C语法简记

开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简略的笔记,不算是语法书。

代码文件

Objective-C的代码文件有3种,“*.h”的头文件;”*.m”是普通的源代码文件,里面可包含Objective-C和C的代码;“*.mm”也是源文件的一种,里面可包含Objective-C,C和C++的代码。

最简单的HelloWorld

1 #import <UIKit/UIKit.h>
2 #import "HGAppDelegate.h"
3 
4 int main(int argc, char *argv[])
5 {
6     printf("Hello world\n");
7     NSLog(@"Hello world");
8 }

取代了以前熟悉的#include预处理命令,换成了#import,但尖括号“<”,“>”还有双引号的意义与以前一样,printf语句依然能输入那句经典的Hello world,在Objective-C中就有了一种新的方式——NSLog(@"Hello world");大凡以NS前缀开头的类都是系统预先定义好的类,比如字符串NSString,后来的NSArray等。NSLOG传入了参数也是“Hello world”,但前面多加了一个@,这个是Objective-C字符串的写法,如果要声明一个字符串的变量并附初值@”Hello world”,则是

NSString *str=@”Hello world”;

基本数据类型

Objective-C的基本数据类型和C中的一样的,int是整形,char是字符,float是单精度浮点数,double是双精度浮点数,与C有点区别的在于short和long,这两种在Objective-C写法是short int和long int,在这里多了一个长双精度的类型long double。无符号的在前面多加了一个unsigned,写法如unsigned int。

特有数据类型

  • Id 是指针类型,它的作用与C#/Java的Object类型很类似,可以指向任何引用类型的引用。
  • BOOL 这类型只有两个值YES和NO,就代表着1和0。在C中这两个值也代表true和false。
  • SEL 指向函数的指针,定义并附上初值的形式如下
SEL sel=@selector(方法签名)

SEL sel=NSSelectorFromString(方法名的字符串)

调用的时候则是以下形式

[obj performSelector:sel withObject: nil];

上面obj是对象的实例,sel则是SEL类型的变量,nil则是obj对象的默认值,如果保险起见,调用前要先判断obj对象有没有那个方法,则调用下面的方法,它会返回布尔值,ture就是存在,反之则不存在。

[obj respondsToSelector:sel]:

如果要获取SEL变量所指向的方法的方法名时,可以调用下面的方法,它返回的是一个字符串。

NSStringFromSelector(sel变量):
  • nil,NiL和NSNull nil与C的NULL一样,是指向空的指针,它算是一个对象,一个什么都没有的对象;Nil则是代表空的类,是一个Class来的;NSNull出现在集合中,它代表着集合中空的元素。

流程控制语句

这里讲两种语句switch和foreach,因为这个在C#和Java之间都会有所区别。

  • Switch,switch语句与C中里面的switch一样,每个case之后可以不需要用break;结束并跳出switch语句,它会顺序执行下一个case里面的代码,直到遇到了break或者到达语句末尾为止。这里的case后面与Java一样不能跟字符串。
  • Foreach foreach语句与C#的形式很相像,也是foreach(元素类型 item in 集合的变量名)。在循坏体里面与C#不一样的是它能够去对被遍历的集合进行修改,但是由于更改后枚举器不会做相应的更新,所以如果删除了某些元素刚好被遍历到,有可能会出现空引用的异常。

Objective-C类的定义分声明与实现两个操作,感觉和接口的定义与实现很像。

  • 类声明
@interface ClassName : NSObject
{//字段定义
}//方法,属性等其他成员的声明
@end 
  • 类的实现
@implementation ClassName//方法,属性等其他成员的实现
@end 

方法

方法的声明语法如下

+(void)methodName(paraType1)paraName1 and:(paraType2)paraName2; 

+代表的是静态方法,-代表的是实例的方法;后面的括号代表的是返回类型,这里例如上面的方法是空返回void;方法名总在参数的前面,Objective-C的方法名很特殊,按上面声明的方法,它的方法名师methodName and;参数则是以 :(ParaType)ParaName的形式,如果没有参数,则方法名后面直接以分号“;”结束。调用则通过以下的形式,objIns则是对象的实例名。

[objIns methodName:value1 and:value2]; 

存取方法

对于私有字段而已要对其获取或设置都要通过get/set方法来进行,在Java中通过声明getter/setter方法来实现面向对象编程中的封装性,在Objective-C中也有这类getter/setter方法,称之为存取方法。

例如现在有字段int count,他对应的存取方法是

-(void) setCount: (int)couValue;
-(int) count; 

Setter方法则是以set+对应的字段名,setter直接与字段同名。在调用的时候可以用通常方括号的形式”[” ”]”当不普通方法来调用,可以使用类似C#,Java中点”.”的方式调用,如果点的方式调用,则直接跟上字段的名字则可,如

MyClass.count=12;
Int count=myclass.count; 

属性

如果声明了一个属性,则系统会自动为其生成getter/setter方法。这个与C#的属性挺类似,但是语法形式大不相同。它与类的定义一样,分别有声明与实现两部分

  • 声明
@property(修饰符) int count;
  • 实现

@synthesize count;

如果在实现的时候要指定这个属性是对那个字段经行封装的,可以通过下面的形式,下面则代表了对count字段的封装,记得指定时有加下划线”_”

@synthesize count=_count; 

在声明的时候可以指定修饰符,修饰符可以用多个,每个间用逗号隔开,修饰符及其作用如下所示

  • Readwirte:可供读写;
  • Readonly:只读;
  • Strong:强引用,就是我们在C#和Java中通常使用的引用,就是指该对象在没有被任何一个字段引用才会被GC;
  • Weak:弱引用,就算该对象有被字段引用着,还有可能会被GC;
  • Copy:赋值的时候只给一个副本,不会给它本身;
  • Assign:在通过setter赋值时不会增加该对象的引用计数器,这针对NSString类型和基础数据类型;
  • Retain:调用时会释放前一个引用的对象,但是引用计数器会加1;
  • Nonatomic:表明这个属性不考虑线程安全问题。

如果不使用系统自动生成的getter或setter方法,可以通过在修饰符的地方指定自己定义的getter方法和setter方法的签名,如

@property(getter=mygetter,setter=mysetter:) int count;

又叫作代码块,声明的语法如下

ReturnType(^BlockName)=^(paraType1 para1,paraType2 para2){ /*代码内容*/ };

等号左边相当于声明块的变量,等号右边相当于块的字面值,块的效果类似于Lumbda表达式,调用时就如C/C#中调用方法那样

BlockName(para1,para2);

协议

语法如下

@protocol ProtocoName//方法声明

@optional //可选实现//方法声明

@required//必须实现//方法声明@end

这个类似于接口,实现是在类的声明处以下面的形式

@interface ClassName:NSObject<ProtocoName1,…..>

类别

语法如下

@interface ClassName(CategoryName)//方法声明@end//其他代码@implementation ClassName(CategoryName)//方法声明@end 

用于给已经定义的类扩展方法,ClassName是已经定义的类,要被扩展的类,CategoryName是类别名,类别中的方法如果遇到方法签名一样的方法,则会覆盖原有的方法;类别中的成员只局限于方法,字段那些是不能定义的;若是覆盖了方法,那么那个覆盖的作用域是整个程序。

Self与supper

  • Self是类隐藏参数,类似Java与C#的this,调用方法时先向本类搜索方法,没有的话再向父类搜索。
  • Super则是预编译指令,类似C#与Java的super,但是不完全一样,这里的super不代表对父类的引用,只是在调用方法时先从父类搜索,如果没有则再往父类的父类中搜索,只在调用方法时有C#/Java的效果,本质还是对当前类的引用。

内存管理

在开始时调用

NSAutoreleasePool *pool=[ [NSAutoreleasePool alloc] init]; 

结束的时候

[pool release];

构造对象

[[ClassName alloc] init];

释放对象

[ClassInsName release]; 

规则:1)自己用alloc或者copy创建的对象,在用完的时候要release;2)对不是自己创建的对象,则不要去release;3)retain对象后,要realease,两者要对称,有多少个retain就要有多少个release。

异常与错误

Objective-C的异常处理与C#和Java差不多,也是由try catch finally语句块组成,抛异常用throw。格式如下

@try
{  }
@catch(NSException *ex)
{
@throw
}
@finally
{}

和C#的关键字一样的,只是多了个“@”,catch块中的@thorw只是为了演示用。

在Objective-C中NSError让人的感觉与NSException类似,都是与错误有关,但实际上两者在用法上大有不同,NSException是异常,记录异常的信息,异常是在程序出现,会让程序卡住的。NSError是错误,是记录错误的信息,例如调用了某些方法失败后,会在传入方法的NSError对象中填写相关的错误信息,有NSError不会让程序卡死,但出现了NSException不捕捉则会让程序卡死,NSException可以被抛出和捕捉,NSError没有抛出和捕捉这个概念。

转载于:https://www.cnblogs.com/HopeGi/p/4088138.html

相关文章:

java编写最大公约数_Java编写最大公约数和最小公倍数

package javaapplication24;class NegativeIntegerException extends Exception{String message;public NegativeIntegerException(){message"方法的参数值不是正整数";}public String toString(){return message;}}class MaxCommonDivisor{public int getMaxCommonD…

肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法

由于能力有限&#xff0c;算法层面的东西自己去创新的很少&#xff0c;很多都是从现有的论文中学习&#xff0c;然后实践的。 本文涉及的很多算法&#xff0c;在网络上也有不少同类型的文章&#xff0c;但是肯定的一点就是&#xff0c;很多都是不配代码的&#xff0c;或者所附带…

【算法学习】堆排序建立最大堆

本文代码均转自&#xff1a; 作者&#xff1a;早就戒了 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/qq_37169817/article/details/79777264 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请附上博文链接&#xff01; 1 public class HeapSort { 2…

设计模式 之美 -- 代理模式

文章目录1. 解决问题2. 应用场景1. 业务系统的非功能性开发2. 代理模式在RPC、缓存中的应用3. 实现C实现C语言实现1. 解决问题 客户端和目标对象之间需要进行交互&#xff0c;此时客户端类和目标对象类相关操作之间的逻辑如果交合在一起&#xff0c;会导致客户端和目标对象模块…

java中注解的使用_java中注解的使用

使用过ssh框架的人一定也使用过注解&#xff0c;尤其是在spring框架中&#xff0c;注解可谓是spring容器和AOP编程的重要环节。注解就是用于修饰类、全局变量、方法、参数或局部变量的接口&#xff0c;java中规定&#xff0c;注解的使用不允许影响其修饰类的存在&#xff0c;也…

水题/poj 1852 Ants

1 /*2 PROBLEM:poj18523 AUTHER:Nicole4 MEMO:水题5 */6 #include<cstdio>7 using namespace std;8 int cmax(int a,int b){return a>b?a:b;}9 int cmin(int a,int b){return a<b?a:b;} 10 int main() 11 { 12 int cases; 13 scanf("%d…

素数、最大公约数、最下公倍数、质因数分解

2013-08-18 11:20:43 素数、最大公约数、最下公倍数、质因数分解都是与素数相关的&#xff0c;解决了素数的问题&#xff0c;其他的都可以此为基础求解。 小结&#xff1a; 求1到n之间的素数的基本方法是通过遍历2到sqrt(n)&#xff0c;判断每个数是否是素数来得到&#xff0c;…

Spring注解 开发

转载于:https://www.cnblogs.com/JBLi/p/10489541.html

读书:个人成长 -- 即兴演讲

与人交流时&#xff0c;有人发言语无伦次&#xff0c;舌头像打了结。 有人一开讲便滔滔不绝&#xff0c;却毫无重点。 也有人说话索然无味&#xff0c;没法让你投以关注。 如何在任何场合游刃有余地表达&#xff1f; 如何掌控此时此刻&#xff0c;用说话影响他人&#xff1f; …

php mysql环境搭配_centos6.7下搭配apache php mysql环境

安装过程安装apacheapache默认端口为80, 而nginx默认端口也是80, 所以安装apache前, 检查是否安装了nginx, 确保80端口没有被占用, 然后执行以下命令安装apacheyum install httpd httpd-devel启动apache服务/etc/init.d/httpd start或service httpd start停止apache服务/etc/in…

我们如此努力,也不过是个普通人

http://www.nowamagic.net/librarys/eight/posts/2500文 / 張君雅 南方日报曾刊登了一条新闻&#xff0c;大意是说有个女孩子以她的成绩考入北大清华没问题。但她从小参加各种社会活动&#xff0c;深受曾留学法国的母亲“生命的意义在于体验最多而不是最好”影响&#xff0c;决…

Citrix XenServer@cloudstack基本功能测试报告2

Cloudstack功能测试1、创建Zone、Pod、Clusters&#xff0c;添加hosts、Primary Storage、Secondary Storage步骤&#xff1a;1、 登录cloudstack控制板2、 选择基础架构&#xff0c;选择区域&#xff0c;点击查看全部&#xff0c;然后点击添加区域3、 选择基本区域类型4、 输入…

ABP中的Filter(下)

接着上面的一个部分来叙述&#xff0c;这一篇我们来重点看ABP中的AbpUowActionFilter、AbpExceptionFilter、AbpResultFilter这三个部分也是按照之前的思路来一个个介绍&#xff0c;当然这里面如果和前面的Interceptor有重复的部分&#xff0c;那么将会对两者进行一个对比并作出…

LRU算法 -- 链表 完整实现

LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法&#xff0c;其中内存管理模块进行内存页回收时有用到&#xff0c;针对不经常使用的内存页&#xff0c;LRU淘汰策略能够将该内存页回收给操作系统。 属于 我们操作系统设计中的 时间局部性原理&#xff0c;最长时…

python getostime_python中sys,os,time模块的使用(包括时间格式的各种转换)

sys模块sys.argv: 实现从程序外部向程序传递参数。位置参数argv[0]代表py文件本身&#xff0c;运行方法 python xx.py 参数1&#xff0c;参数2 。。self sys.argv[0]name sys.argv[1]age sys.argv[2]print self, name, agesys.getdefaultencoding(): 获取系统当前编码&#…

关于SpringMVC和Struts2的区别

1. 与struts2不同 1、 springmvc的入口是一个servlet即前端控制器&#xff0c;而struts2入口是一个filter过虑器。 2、 springmvc是基于方法开发&#xff0c;传递参数是通过方法形参&#xff0c;可以设计为单例或多例(建议单例)&#xff0c;struts2是基于类开发&#xff0c…

DC-RC加固修补型砂浆

DC-RC加固修补型砂浆www.hrbjg.net一、DC-RC加固修补型砂浆的产品特点&#xff1a;1、耐火、耐高温、耐腐蚀、耐老化性能优良。2、强度高&#xff0c;抹灰操作性好。3、与原混凝土结构的粘结性能良好。4、无收缩&#xff0c;基本不会产生裂缝。5、二氧化碳、氯化物等透过性差&a…

类,实例,属性习题

class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.restaurant_namerestaurant_name self.cuisine_typecuisine_type def describle_restaurant(self): print("打印的第一条消息") print("打印的第…

数据结构和算法 -- 学习导图

数据结构和算法 是作为程序员写出高效代码的基础&#xff0c;为了今后的两年在高效代码之路上持续精进&#xff0c;将按照此学习导图进行 算法和数据结构的刻意练习&#xff0c;同时也希望为同样有高效代码追求的伙伴们提供一条学习路径&#xff0c;共同进步。 以下为今后持续…

HDU 1248 寒冰王座(全然背包:入门题)

HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,仅仅有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买…

java 彩票系统_JAVA版彩票随机生成系统

import java.io.*;import java.util.Random;class num{public static void main(String[]args){//声明一个随机数组int sjsh[]new int[7];int sum;try{InputStreamReader anew InputStreamReader(System.in);BufferedReader bnew BufferedReader(a);System.out.println ("…

Windows Server 2012 文件服务器群集

概述&#xff1a;之前已经测试了Windows Server 2012系统群集、Hyper-V群集&#xff0c;接下来将测试Windows Server 2012 文件服务器群集功能。实验环境&#xff1a;4台服务器都为Windows Server 2012 DataCenter操作系统在之前配置了群集的基础上&#xff0c;SRV2012服务器新…

023 判断出栈顺序是否正确

1.题目 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。 假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列&#xff0c;序列4、5、3、2、1是该压栈序列对应的一个弹出序列&#xff0c;但4、3…

栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

文章目录实现顺序栈实现链式栈实现应用函数栈 的应用表达式求值中 的应用括号匹配中 的应用我们使用浏览器的时候经常会用到前进、后退功能。依次访问完一串页面 a – b – c之后点击后退功能&#xff0c;则能够依次看到c – b – a的页面。但是这个过程中&#xff0c;如果后退…

OC中的NSArray和NSMutableArray、NSDictionary和NSMutableDictionary用法

一&#xff1a;NSArray 和NSMutableArray1: NSArray&#xff1a;不可变数组NSArray是OC中使用的数组&#xff0c;只能用来存放OC对象&#xff0c;不能存放非OC对象如基本数据类型它使不可变的&#xff0c;一旦初始化完毕&#xff0c;内容不能改变&#xff0c;也不能添加元素。而…

java中ContentArea_java中TextArea怎么加载指定路径的文本内容

展开全部这设计到IO操作&#xff0c;很62616964757a686964616fe58685e5aeb931333332643334久以前练手写的加载文本到文本域的界面。具体代码第一步&#xff1a;得到一个File对象&#xff0c;需要参数文本路径File file new File("C:\\test.txt");第二步&#xff1a;…

文本分类技术基础

分类体系 分类&#xff1a;给定一个对象&#xff0c;从一个事先定义好的分类体系中挑出一个或多个最适合该对象的类别。 文本分类(TC, Text Categorization)&#xff1a;在给定的分类体系下&#xff0c;根据文本内容自动的确定文本关联的类别。从数学角度看&#xff0c;文本分类…

C# 返回值为 listT

public List<T> test<T>(List<T> EntityList) where T : class{return EntityList;} 转载于:https://www.cnblogs.com/enych/p/10497312.html

ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析

文章目录内存查看内存控制内存控制源码分析通过gperftools接口获取osd进程实际内存 动态设置cache大小动态调整cache比例trim释放内存本文通过对ceph-osd内存查看跟踪的5种手段以及osd内存控制的方式进行源码层面的说明&#xff0c;并未通过修改相关源码进行控制&#xff08;水…

c语言函数库学习~sscanf~格式化输入

---恢复内容开始--- 今天算是被打击到了吧&#xff0c;由郑轻的acm老师来我学院指导安排了个现场的小比赛&#xff0c;&#xff0c;俺们居然有还是输给一个大一的新手&#xff0c;&#xff0c;哎&#xff0c;情何以堪&#xff0c;&#xff0c;所以还是要重视下基础编程能力的培…