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;//性别枚举

程序代码如下:

 /* 设计一个学生类
类名:学生
成员变量:姓名,性别,生日,体重,喜欢的颜色,每个学生都养一条狗(狗也是一个对象)
方法:吃饭,锻炼,遛狗(让狗run),喂狗(让狗eat)
*/
#import <Foundation/Foundation.h>
typedef enum
{
//标准写法,枚举常量名字含有枚举类型的名字,一目了然,容易阅读
SexMan,//
SexWoman//
} Sex; typedef struct{
int year;
int month;
int day;
} Date; typedef enum{
ColorBlack,//
ColorWright,//
ColorRed//
} Color; //狗类声明
//成员变量:体重,毛色
//方法:吃东西,跑
@interface Dog : NSObject
{
@public
double hairColor;//毛色
double weight;//体重
}
- (void) eat;
- (void) run;
@end
//狗类实现
@implementation Dog
- (void) eat
{ weight += ;
NSLog(@"喂狗饭,体重是%f", weight);
}
- (void) run
{
weight -= ;
NSLog(@"遛狗后,体重是%f", weight);
}
@end
//学生类声明
@interface Student : NSObject
{
@public
char *name;//姓名
//如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享,BOOL sex;要么男,要么女,YES or NO
//如果属性只有几个固定的取值,那么最好用枚举
Sex sex;//性别枚举
//不要写成这样,很傻,很累,使用结构体
//int year;
//int month;
//int day;
Date birthday;//生日结构
double weight;//体重
Color favourColor;//最喜欢的颜色枚举
//每个学生都养一条狗,必须用指针,oc的对象都是用指针来操作的!
Dog *dog;
}
//类的声明里,任何数据类型都是可以声明的,对象方法的声明,不在花括号里,但是在类的声明范围内写
- (void) eat;
- (void) exercise;
- (void) print;//打印全部信息
- (void) walkTheDog;//遛狗
- (void) feedTheDog;//喂狗
@end
//设计到这一步,类还没完成,如果没有类的实现,编译没事,但是链接会报错。必须有类的实现
@implementation Student
- (void) eat
{ weight += ; //每吃一顿,体重增加一公斤
NSLog(@"吃完饭,体重是%f", weight);
}
- (void) exercise
{
weight -= ; //每次锻炼,体重减少一公斤
NSLog(@"锻炼后,体重是%f", weight);
}
- (void) print
{
NSLog(@"性别 = %d, 喜欢的颜色 = %d, 姓名= %s, 生日 = %d-%d-%d", sex, favourColor, name, birthday.year, birthday.month, birthday.day);
}
- (void) walkTheDog
{
//调用狗类对象的run方法,这是面向对象思维的体现
[dog run]; }
- (void) feedTheDog
{
[dog eat];
}
@end int main()
{
Student *student = [Student new];
student->weight = ; //体重
student->sex = SexMan; //性别
//下面的写法不对,只有在定义结构体变量的同时初始化是合法的,而现在因为已经存在了结构体的变量(类声明里),不可以用下面的方法再次直接去初始化,否则报错
//student->birthday = {1990, 11, 11};//生日 //可以用下面的方法,重定义生日结构新的变量,同时初始化,再赋值给birthday
//Date date = {1990, 11, 11};
//student->birthday = date; //或者使用下面的方法,使用指针去访问结构体变量birthday,再使用结构体变量访问里面的结构体成员,去赋值
student->birthday.year = ;
student->birthday.month = ;
student->birthday.day = ; //最喜欢的颜色
student->favourColor = ColorBlack;
//姓名
student->name = "dashuai";
//学生类内部的狗的指针成员去指向一个狗类的一个对象(也就是一条狗)
Dog *d = [Dog new];//创建狗类的一个对象,用d指向
d->hairColor = ColorWright;
d->weight = ;//访问狗类的成员
student->dog = d;//把这个狗类的对象赋值给学生类里狗类的指针,被该指针指向,学生就可以操作狗的对象了
[student walkTheDog];
[student feedTheDog];
[student print]; // [student eat];
// [student eat];
// [student exercise];
// [student exercise];
return ;
}

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 也是一样。

欢迎关注

dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!

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

  1. Objective-C基础语法快速入门

    Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...

  2. jenkins2 pipeline 语法快速参考

    jenkins2 pipeline中常用的语法快速参考. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciand ...

  3. Razor 语法快速参考

    Razor 语法快速参考   本文引自:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx 语法名称 Raz ...

  4. 第二章 C#语法快速热身

    C#语法快速热身 语法 if(条件表达式){ 代码块 } 语法 if(条件表达式){ 代码块 }else{ 代码块2 } 语法 if(条件表达式1){ 代码块1 if(条件表达式1)){ }else{ ...

  5. Less 语法快速入门

    Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...

  6. objective-c 语法快速过(6)内存管理原理

    内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不 ...

  7. objective-c 语法快速过(4)

    oc 里的字符串 字符串的快速创建(最简单的方法) NSStirng *str = @“Hello”;//oc的字符串都是@“”形式的 oc的字符串也是类的对象,是NSString类的对象,创建没有那 ...

  8. objective-c 语法快速过(1)

    有一定 c++或者 java 基础,过一遍 oc 语法即可,都是相通的,个人认为难点是 oc 的内存管理,虽然有了 ARC,但是也需要学习下,因为有旧软件的维护. 建立在C语言的基础上,增加了一层小范 ...

  9. Emmet语法 —— 快速生成HTML结构

    快速生成HTML结构语法 1.生成单个标签 : 标签名+tab,比如 div 然后tab 键, 就可以生成 <div></div> 2.生成多个相同标签 div*3 + tab ...

  10. objective-c 语法快速过(8)

    Block(oc 的数据类型,很常用,本质是c结构体) 类似内联函数,从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.编译时,类似宏替换,使用函数体替换调用处的函数名 Block封装了一段 ...

随机推荐

  1. NFSv4的引用,迁移和备份(用户手册 v0.2)

    RFC3530 定义了NFS文件系统迁移和引用的管理机制.文件系统定位功能通过fs_location属性向客户端提供文件系统的位置信息.fs_location属 性是一个包含有位置信息的列表,位置信息 ...

  2. SpringMVC自定义处理器里的那些事

    一.如何让一个普通类成为Controller? ①:实现接口Controller 解析:handleRequest(request,response) ②:继承AbstractController 解 ...

  3. 【noip 2016】 蚯蚓(earthworm)

    100分程序,写了2天+1小时 →题目在这里← 大神就是厉害--写的程序居然看都看不懂,还有就是cena上过了但是luogu上一直是恶心的TLE 首先是考虑p=0时,数组大小开到了1100000,然后 ...

  4. Struts 2的拦截器(Interceptor)总结

     什么是Struts 2拦截器? 从软件构架上来说,拦截器是实现了面向方面编程的组件.它将影响了多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现功能的高度内聚,确保了业务对象 ...

  5. jQuery模仿淘宝商品评价

    最近做项目要做个商品评价的功能,我直接就跑到淘宝那里去研究了,可看着晕晕的,还不知道他是怎么做的,于是把图抠了下来,自己写了一个,接下来就展示一下我是怎么做的,大家有不同的实现方法可要记得分享一下呀. ...

  6. [译]MVC网站教程(一):多语言网站框架

    本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...

  7. .net中事件引起的内存泄漏分析

    系列主题:基于消息的软件架构模型演变 在Winform和Asp.net时代,事件被大量的应用在UI和后台交互的代码中.看下面的代码: private void BindEvent() { var bt ...

  8. .Net开发笔记(十七) 应用程序扩展

    在很多场合,我们需要在已有软件程序上增加一些新的功能,几乎所有原因是因为原有软件功能不能满足我们的需要,我们平时做的插件就属于这种情况,最常见的是VS IDE的插件开发,网上老外写的一篇关于插件开发的 ...

  9. 仅此一文让你明白ASP.NET MVC 之View的显示(仅此一文系列二)

    题外话 一周之前写的<仅此一文让你明白ASP.NET MVC原理>受到了广大学习ASP.NET MVC同学的欢迎,于是下定决心准备把它写成一个系列,以满足更多求知若渴的同学们.蒋金楠老师已 ...

  10. js框架模版

    (function() { //注册命名空间zzw到window对象上 window['zzw'] = {} //定义一个$函数 function $() { alert("hello $& ...