objective-c 语法快速过(2)

oc类的声明和定义的常见错误

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

2、漏了@end

3、@interface和@implementation嵌套,也就是@interface或者@implementation和@end必须成对出现!两者中间不能嵌套任何别的。

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

5、方法的声明写在了声明的大括号里面,或者方法的实现写在了声明里。这都是不对的。

6、忘记了:NSObject

7、想直接修改类成员变量,但是没有设置为@public

8、类的声明里的实例变量,不能在声明的时候初始化。

9、不能把成员变量当做c语言的变量,比如加static,不对!类的声明里只能写类的成员变量名

10、记住:方法是方法,函数是函数,也不能给方法加比如static。没有这个东西

11、成员变量不能在{}中进行初始化、默认不能被直接拿出去访问

12、方法不能当做函数一样调用或者声明,对象方法只能是对象来调用

13、类的实现可写在main函数的后面,只要在类的声明后面就行了

14、记住:oc里对象方法名包含冒号,oc不允许方法名一样,-或者+不是方法名

OC方法和函数的区别

1、OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

2、C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

3、C函数不能访问OC对象的成员

4、低级错误:方法有声明,但是实现的时候写成了函数

5、oc的函数可以写在文件的任何位置(除@interface和@end之间除外,可以写在类的实现里),归文件所有

OC的方法使用注意

1、方法只有声明,没有实现(这是经典错误)

2、方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

3、编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告,弱语法

4、没有@interface,只有@implementation,也能成功定义一个类

@implementation Car : NSObject
{

    @public

    int wheels; // 轮子

    int speed; // 时速

}
//方法就不用声明了,直接在类的实现里写定义即可
- (void) run

{
    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}

@end

类里涉及到声明性别,时间等

如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享。如果属性只有几个固定的取值,那么最好用枚举。

对于年月日的声明不要写成这样,很傻,很累,

  //int year;

    //int month;

    //int day;

使用结构体

  Date birthday;//生日结构

  double weight;//体重

  Color favourColor;//最喜欢的颜色枚举
Sex sex;//性别枚举

程序代码如下:

  1 /* 设计一个学生类
  2  类名:学生
  3  成员变量:姓名,性别,生日,体重,喜欢的颜色,每个学生都养一条狗(狗也是一个对象)
  4  方法:吃饭,锻炼,遛狗(让狗run),喂狗(让狗eat)
  5 */
  6 #import <Foundation/Foundation.h>
  7 typedef enum
  8 {
  9     //标准写法,枚举常量名字含有枚举类型的名字,一目了然,容易阅读
 10     SexMan,//0
 11     SexWoman//1
 12 } Sex;
 13
 14 typedef struct{
 15     int year;
 16     int month;
 17     int day;
 18 } Date;
 19
 20 typedef enum{
 21     ColorBlack,//0
 22     ColorWright,//1
 23     ColorRed//2
 24 } Color;
 25
 26 //狗类声明
 27 //成员变量:体重,毛色
 28 //方法:吃东西,跑
 29 @interface Dog : NSObject
 30 {
 31     @public
 32     double hairColor;//毛色
 33     double weight;//体重
 34 }
 35 - (void) eat;
 36 - (void) run;
 37 @end
 38 //狗类实现
 39 @implementation Dog
 40 - (void) eat
 41 {
 42
 43     weight += 1;
 44     NSLog(@"喂狗饭,体重是%f", weight);
 45 }
 46 - (void) run
 47 {
 48     weight -= 1;
 49     NSLog(@"遛狗后,体重是%f", weight);
 50 }
 51 @end
 52 //学生类声明
 53 @interface Student : NSObject
 54 {
 55     @public
 56     char *name;//姓名
 57     //如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享,BOOL sex;要么男,要么女,YES or NO
 58     //如果属性只有几个固定的取值,那么最好用枚举
 59     Sex sex;//性别枚举
 60     //不要写成这样,很傻,很累,使用结构体
 61     //int year;
 62     //int month;
 63     //int day;
 64     Date birthday;//生日结构
 65     double weight;//体重
 66     Color favourColor;//最喜欢的颜色枚举
 67     //每个学生都养一条狗,必须用指针,oc的对象都是用指针来操作的!
 68     Dog *dog;
 69 }
 70 //类的声明里,任何数据类型都是可以声明的,对象方法的声明,不在花括号里,但是在类的声明范围内写
 71 - (void) eat;
 72 - (void) exercise;
 73 - (void) print;//打印全部信息
 74 - (void) walkTheDog;//遛狗
 75 - (void) feedTheDog;//喂狗
 76 @end
 77 //设计到这一步,类还没完成,如果没有类的实现,编译没事,但是链接会报错。必须有类的实现
 78 @implementation Student
 79 - (void) eat
 80 {
 81
 82     weight += 1; //每吃一顿,体重增加一公斤
 83     NSLog(@"吃完饭,体重是%f", weight);
 84 }
 85 - (void) exercise
 86 {
 87     weight -= 1;    //每次锻炼,体重减少一公斤
 88     NSLog(@"锻炼后,体重是%f", weight);
 89 }
 90 - (void) print
 91 {
 92     NSLog(@"性别 = %d, 喜欢的颜色 = %d, 姓名= %s, 生日 = %d-%d-%d", sex, favourColor, name, birthday.year, birthday.month, birthday.day);
 93 }
 94 - (void) walkTheDog
 95 {
 96     //调用狗类对象的run方法,这是面向对象思维的体现
 97     [dog run];
 98
 99 }
100 - (void) feedTheDog
101 {
102     [dog eat];
103 }
104 @end
105
106 int main()
107 {
108     Student *student = [Student new];
109     student->weight = 50;  //体重
110     student->sex = SexMan;    //性别
111 //下面的写法不对,只有在定义结构体变量的同时初始化是合法的,而现在因为已经存在了结构体的变量(类声明里),不可以用下面的方法再次直接去初始化,否则报错
112     //student->birthday = {1990, 11, 11};//生日
113
114 //可以用下面的方法,重定义生日结构新的变量,同时初始化,再赋值给birthday
115     //Date date = {1990, 11, 11};
116     //student->birthday = date;
117
118 //或者使用下面的方法,使用指针去访问结构体变量birthday,再使用结构体变量访问里面的结构体成员,去赋值
119     student->birthday.year = 1990;
120     student->birthday.month = 5;
121     student->birthday.day = 28;
122
123     //最喜欢的颜色
124     student->favourColor = ColorBlack;
125     //姓名
126     student->name = "dashuai";
127     //学生类内部的狗的指针成员去指向一个狗类的一个对象(也就是一条狗)
128     Dog *d = [Dog new];//创建狗类的一个对象,用d指向
129     d->hairColor = ColorWright;
130     d->weight = 20;//访问狗类的成员
131     student->dog = d;//把这个狗类的对象赋值给学生类里狗类的指针,被该指针指向,学生就可以操作狗的对象了
132     [student walkTheDog];
133     [student feedTheDog];
134     [student print];
135
136 //    [student eat];
137 //    [student eat];
138 //    [student exercise];
139 //    [student exercise];
140     return 0;
141 }

Xcode 的代码提示功能的关闭和开启

再次熟悉下,oc 里方法名,方法类型,返回值类型,方法参数的部分

开发 IOS 到一定程度,要习惯看苹果的官方文档

oc 里的数据类型

Object-c提供基本数据类型:int 、float 、double 、char

int:

八进制 ,整型第一位为 0, NSLog 的格式符为: %o ,显示的八进制不带前导 0

十六进制 ,以 0x 开头的整型,NSLog 的格式符为: 若(%X 或%#X) 显示的十六进制用大写

%#o 显示的八进制带前导0

%x 显示的十六进制不带前导 0x

%#x 显示的十六进制带前导0x

float:
NSLog 的格式符:%f
NSLog 的格式符:%e 科学计数法显示值
NSLog 的格式符:%g 指数的值小于-4 大于 5,采用%e,否则采用%f

十六进制的浮点常量包含前导 0x 或 0X,后面紧跟一个或多个十进制或十六进制数字,再后是p 或 P,最后,是可以带符号的二进制指数。例:0x0.3p10 表示的值为 3/16*2^10

注:若无特殊说明,Object-c 将所有的浮点常量看做 double 值,要显示 double 值可使用和 float一样的格式符。

char:

NSLog 的格式符:%c

long double 常量写成尾部带有字母 l 或者 L 的浮点常量。1.234e+7L


注:id 类型可以通过类型转化符可以将一般的id 类型的对象转换成特定的对象。

_Bool ;处理 Boolean(即 0 或 1)

_Complex;处理复数
_Imaginary;处理抽象数字

键盘输入:

int number;

scanf("%i",&number); 

实例变量的初始化值默认为 0

实例变量作用域的指令:

@protected;实例变量可被该类及任何子类中定义的方法直接访问(默认的情况) 。

@private;实例变量可被定义在该类的方法直接访问,不能被子类定义的方法直接访问。

@public;实例变量可被该类中定义的方法直接访问,也可被其他类或模块中定义的方法访问。使得其他方法或函数可以通过(->)来访问实例变量(不推荐用) 。

@package;对于 64 位图像,可以在实现该类的图像的任何地方访问这个实例变量。

在类中定义静态变量和 C 一样

voaltile说明符和const 正好相反,明确告诉编译器,指定类型变量的值会改变。(I/O端口)

比如要将输出端口的地址存储在 outPort 的变量中。

volatile char *outPort;
*outPort = ‘O‘;
*outPort = ‘N‘;

这样就可以避免编译器将第一个赋值语句从程序中删除 。

枚举数据类型、typedef 语法以及数据类型的转换和 C 也是一样。

时间: 2024-10-11 15:22:46

objective-c 语法快速过(2)的相关文章

Swift语法快速索引

在WWDC的演示中就可以看出来Swift这个更接近于脚本的语言可以用更少的代码量完成和OC同样的功能.但是对于像我一样在战争中学习战争的同学们来说,天天抱着笨Swift Programming Language Reference之类的大部头看不实际.毕竟还是要养家糊口的.而且,那么1000+页内容讲的东西不是什么都要全部在平时工作中用到的.咱们就把平时用到的全部都放在一起,忘记了立马翻开看看,不知不觉的就学会了之后变成习惯.这样多省事. 变量 1 // Variable 2 var int_v

markdown语法快速入门

# markdown语法快速入门 > 只记住下面的语法就可以满足日常使用了 **强调***斜体*~~划掉~~++下划线++==字体颜色==# 标题一## 标题二### 标题三#### 标题四##### 标题五###### 标题六---分割线> 引用的文字 - 无序列表 - 无序列表- 无序列表 1. 有序列表2. 有序列表3. 有序列表 - [ ] 未完成任务列表- [ ] 未完成任务列表- [x] 已完成任务列表 [链接](http://www.xxxx.com/) ![image](htt

Objective-C基础语法快速入门

Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会非常有用.假如我们对C语言还不熟悉的话,那我们需要学习一下C语言. AD: 2010年11月编程语言排行榜和2月编程语言排行榜讲的都是Objective-C.Objective-C是Mac软件开发领域最主要的开发语言,假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C

《Swift语法快速入门》已可购买,《Swift殿堂之路》接受预定

<Swift语法快速入门>已由电子工业出版社出版,京东当当有售.需要签名版本的朋友,请与我联系.另外,IOS开发常用类库实例演练<Swift殿堂之路>已接受预订,预订链接:http://www.swiftbang.com/read-5-1 在学习Swift的过程中,如有任何疑问,请加入Swift书友会QQ群:259152129,与作者一起讨论.研究Swift开发技术! 欢迎你!

objective-c 语法快速过(6)

内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量等 管理范围:任何继承了NSObject的对象,对其他基本数据类型(int.char.float.double.struct.enum等)无效,和 java 不一样,oc 开始的时候没有垃圾自动回收机制. OC对象的基本结构 每个OC对象都有自

互联网世界中的C语言——我的golang学习笔记:1(基础语法快速过)

前言 学习任何知识都会有一个学习背景 最近,我们团队乃至我司整个云服务,上go的呼声越来越高!新服务已经开始用go开发,部分现有Java版的服务重构为go也只是时间问题而已,故相关技术积累势在必行!在云网络的分布式服务乃至在一切高并发,分布式后台服务中,golang都有着很大的优势. 据我对国内互联网行业的实际考察,了解,目前国内主流互联网公司都在积极投入go的怀抱…… 青云更是全栈使用了go…… 还有火的一塌糊涂的docker. 它为云而生. 它为并发而生. 还有go的安全.简洁.高效 有良好

objective-c 语法快速过(4)

oc 里的字符串 字符串的快速创建(最简单的方法) NSStirng *str = @“Hello”;//oc的字符串都是@“”形式的 oc的字符串也是类的对象,是NSString类的对象,创建没有那么麻烦不用[ ],使用面向对象的思想来操纵字符串. char *name = "xxxxx";//c风格字符串 oc使用 %@ 输出字符串,不是%s NSString *name = @”dashuai”; NSLog(@“我的名字是%@”, name); c 风格字符串输出解析的用法是%

objective-c 语法快速过(1)

有一定 c++或者 java 基础,过一遍 oc 语法即可,都是相通的,个人认为难点是 oc 的内存管理,虽然有了 ARC,但是也需要学习下,因为有旧软件的维护. 建立在C语言的基础上,增加了一层小范围的面向对象的语法(保留了面向对象最精华的部分,oc的内容没有java多,而java的内容没有c++多,c++的内容最为繁杂),OC完全兼容C语言,c和oc可以混编.可以在OC代码中混入C语言代码(前提是oc源文件扩展名是.m),甚至是C++代码(不是所有的源文件都能包含c++代码,只有源文件扩展名

objective-c 语法快速过(8)

Block(oc 的数据类型,很常用,本质是c结构体) 类似内联函数,从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.编译时,类似宏替换,使用函数体替换调用处的函数名 Block封装了一段代码,可以在任何时候执行 Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务.集合遍历.集合排序.动画转场用的很多 Blocks的定义: int (^MySum)(int, int) = ^(int a, int b)

objective-c 语法快速过(7)

ARC(是编译器特性) ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切 ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器.因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化 ARC基本原理(不是类似 java 的垃圾回收机制) ARC 的规则非常简单:只要还有一