一 了解一下,找参考资料

1.看书学习object-c语法,第一本看的是《objective-c程序设计》。

2.官网:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html

二 定义类

1. 格式

object-c中定义类的方式和c#不同,它分为两个部分,一般放在两个独立的文件中:

①在@interface部分声明类,文件格式.h;

②在@implementation部分实现类,文件格式.m。

2.@interface 部分

Fraction.h

#import <Foundation/Foundation.h>

@interface Fraction : NSObject
-(void)setAge:(int)age;
-(int)getAge;

@end

以上代码有几点说明:

①NSObject是默认的父类;

②方法前面的负号(-)表示这是一个实例方法;如果是正号(+)表示这是一个类方法。

3. @implementation 部分

Fraction.m

#import "Fraction.h"

@implementation Fraction
{
int _age;
}
-(void)setAge:(int)age
{
_age=age;
}
-(int)getAge
{
return _age;
}

@end

4.调用

注意:@autoreleasepool引入了自动计数处理内存释放问题;看一下对象初始化和方法调用的格式。

main.m

#import <Foundation/Foundation.h>

#import "Fraction.h"

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

//对象初始化
Fraction *fraction=[Fraction alloc];
        fraction=[fraction init];

//调用方法
        [fraction setAge:100];
int age=[fraction getAge];

//打印结果
NSLog(@"the age is %i",age);
    }

}

三 基本数据类型

1. 基本类型

object-c的几种基本数据类型: int ,float,double,char

2.float类型

NSLog转换字符为 %f或者%g

NSLog(@"The float result is %f",f);//The float result is 1.230000

NSLog(@"The float result is %g",f);//The float result is 1.23

3.字符串

用@开头并且放在双引号中的字符串是NSString字符串类型。

各类型的NSLog输出转换如下:
int main(int argc,const char* argv[]){
    @autoreleasepool{
        int a=100;
        NSLog(@"the integer value is %i",a);
        float f=1.23;
        NSLog(@"The float result is %f",f);//The float result is 1.230000
        NSLog(@"The float result is %g",f);//The float result is 1.23
        double d=1.2345;
        NSLog(@"The double value is %e",d);//The double value is 1.234500e+000
        char c='V';
        NSLog(@"The char value is %c",c);//The char value is V
    }
    return 0;

}

4.id类型

id数据类型可以存储任何类型的对象。id类型是多态和动态绑定的基础。

5.布尔类型

objective-c中的布尔值是YES和NO.

int main(int argv,const char * argc[])
{
@autoreleasepool {
for(int i=2;i<=50;i++)
        {
bool isPrime=YES;
for(int j=2;j<i;j++)
            {
if(i%j==0)
                {
                    isPrime=NO;
continue;
                }
            }
if(isPrime==YES)
            {
NSLog(@"%i",i);
            }
        }
    }
return 0;

}

四 scanf和NSLog

scanf  :接收输入值,第一个参数始终是C风格的字符串,第二个参数用于指定用户输入的值储存在哪里;

NSLog:输出结果,第一个参数始终是NSString。

int main(int argc, const char * argv[])
{
@autoreleasepool {
int number;
NSLog(@"请输入要计算的数值?");
scanf("%i",&number);
int result=0;
for(int i=1;i<=number;i++)
        {
            result+=i;
        }

NSLog(@"The Triangular number of %i is %i",number,result);

}
return 0;

}

五 类

1 合成存取方法

所谓合成存取方法,就是自动设值和取值,类似于c#中的属性。它的定义和使用步骤为:

①在 @interface 中使用 @property 标识属性;

②在 @implementation 中使用 @synthesize 指令;

③调用属性方法,可以使用传统的方括号语法,也可以使用点运算符进行属性读写。

Fraction.h

#import <Foundation/Foundation.h>
@interface Fraction : NSObject

@property int number1,number2;

-(void)print;

@end

Fraction.m

#import "Fraction.h"
@implementation Fraction

@synthesize number1,number2;
-(void)print
{
NSLog(@"number1 is %i,number2 is %i",number1,number2);

}

@end

main.m

#import <Foundation/Foundation.h>
#import "Fraction.h"

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

{

@autoreleasepool {

Fraction *fraction=[Fraction alloc];
        fraction=[fraction init];

//调用方式1
        [fraction setNumber1:10];
        [fraction
setNumber2:20
];
        [fraction print];
//调用方式2
        fraction.number1=30;
        fraction.
number2=40;

[fraction print];

}

}

2.多个参数的方法

例如我们想同时设置上述例子Fraction中的number1和number2的值,可以使用带多个参数的方法。(说实话,第一次看到这个语法的时候尴尬症都犯了。)

Fraction.h

#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int number1,number2;
-(void)print;
-(void)setNumber1:(int)n1 andNumber2:(int)n2;

@end

Fraction.m

#import "Fraction.h"
@implementation Fraction
@synthesize number1,number2;
-(void)print
{
NSLog(@"number1 is %i,number2 is %i",number1,number2);
}
-(void)setNumber1:(int)n1 andNumber2:(int)n2
{
number1=n1;
number2=n2;
}

@end

main.m

#import <Foundation/Foundation.h>

#import "Fraction.h"

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

{

@autoreleasepool {

Fraction *fraction=[Fraction alloc];
        fraction=[fraction init];

[fraction setNumber1:50 andNumber2:60];
        [fraction print];
    }

}

3.方法带引用类型的参数

Fraction.h

#import <Foundation/Foundation.h>
@interface Fraction : NSObject
        @property int number1,number2;
        -(void)print;
        -(void)setNumber1:(int)n1 andNumber2:(int)n2;
        -(void)add:(Fraction*)f;

@end

Fraction.m

#import "Fraction.h"
@implementation Fraction
@synthesize number1,number2;
-(void)print
{
        NSLog(@"number1 is %i,number2 is %i",number1,number2);
}
-(void)setNumber1:(int)n1 andNumber2:(int)n2
{
        number1=n1;
        number2=n2;
}
-(void)add:(Fraction *)f
{
        number1+=f.number1;
        number2+=f.number2;
}

@end

main.m

#import <Foundation/Foundation.h>

#import "Fraction.h"

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

@autoreleasepool {

Fraction *f1=[[Fraction alloc] init];
        Fraction *f2=[[Fraction alloc] init];
        [f1 setNumber1:1 andNumber2:2];
        [f2 setNumber1:3 andNumber2:4];
        [f1 add:f2];
        [f1 print];
    }

}

六 继承

1. 继承

我们所定义的类都是从NSObject继承而来。

继承实例: 在这个例子中Rectangle是父类,Square是子类。

XYPoint.h

#import <Foundation/Foundation.h>

@interface XYPoint : NSObject
        @property int x,y;
        -(void)setX:(int)x andSetY:(int)y;

@end

XYPorint.m

#import "XYPoint.h"

@implementation XYPoint
@synthesize x,y;
-(void)setX:(int)xVal andSetY:(int)yVal
{
在这个例子中Rectangle是父类,Square是子类        x=xVal;
        y=yVal;
}

@end

父类:

Rectangle.h

#import <Foundation/Foundation.h>

#import "XYPoint.h"

@interface Rectangle : NSObject
@property int width,height;
       -(void)setWidth:(int)w andSetHeight:(int)h;

-(int)area;

-(void)setOrignal:(XYPoint *)original;

-(XYPoint *)original;

@end

Rectangle.m

#import "Rectangle.h"

@implementation Rectangle

{
       XYPoint * _original;

}

@synthesize width,height;
-(void)setWidth:(int)w andSetHeight:(int)h
{
       width=w;
       height=h;
}
-(int)area
{
       return width*height;

}

-(int)area
{
       return width*height;
}
-(void)setOrignal:(XYPoint *)p
{
       _original=p;
}
-(XYPoint *)original
{
       return _original;

}

@end

子类

Square.h

#import <Foundation/Foundation.h>
#import "Rectangle.h"
@interface Square : Rectangle
-(void)setSide:(int)s;
-(int)side;

@end

Square.m

#import "Square.h"

@implementation Square
-(void)setSide:(int)s
{
    [self setWidth:s andSetHeight:s];
}
-(int)side
{
       return self.width;
}

@end

main.m

#import "Rectangle.h"
#import "Square.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {

//父类
       Rectangle *rectangle=[[Rectangle alloc] init];
        [rectangle setWidth:5 andSetHeight:6];
       NSLog(@"rectangle w=%i,h=%i,area=%i",rectangle.width,rectangle.height,[rectangle area]);

//子类
       Square *square=[[Square alloc] init];
        [square setSide:8];
       NSLog(@"square side=%i,area=%i",square.side,[square area]);

}

return 0;

}

2.覆盖

如果子类使用和父类相同的名称定义的方法,可以覆写父类中的方法。新方法必须具有相同的返回类型,并且参数的数目与覆写方法完全一致。例如下面的例子中ClassB覆写了ClassA的initVar方法。

ClassA.h

#import <Foundation/Foundation.h>

@interface ClassA : NSObject
       {
              int x;
       }
       -(void)initVar;
       -(void)print;

@end

ClassA.m

#import "ClassA.h"

@implementation ClassA
-(void)initVar
{
       x=1;
}
-(void)print
{
       NSLog(@"x=%i",x);
}

@end

ClassB.h

#import <Foundation/Foundation.h>
#import "ClassA.h"
@interface ClassB : ClassA
       -(void)initVar;

@end

ClassB.m

@implementation ClassB
-(void)initVar
{
       x=2;
}

@end

main.m

#import "ClassB.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
ClassB * b=[[ClassB alloc] init];

[b initVar];

[b print];// x=2

}
return 0;

}

七 id类型和动态绑定

1. id可以用来存储属于任何类的对象。

例如:

#import "Complex"

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

id d1=[[Complex alloc] init]; //Complex *c1=[[Complex alloc] init];

[d1 setReal:1 andImaginary:2];
       id d2=[[Comlex alloc] init];
        [d2 setReal:3 andImaginary:4];
        [d1 print];
       NSLog(@"     +");
        [d2 print];
       NSLog(@"-------");
       id d3=[d1 add:d2];
        [d3 print];
    }
return 0;

}

注意,这里id类型的声明中不使用星号。

为了尽量在编译期间就识别到更多地错误,并且增强程序的可读性,不要养成滥用id这种通用数据类型的习惯。尽量使用静态类型和有意义的变量名来提高程序的可读性。

八 捕捉异常

@try …@catch可以捕获到程序中的异常,如下所示:

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

@try {

...

}
@catch (NSException *ex) {
NSLog(@"error name:%@ ;reason:%@",[ex name],[ex reason]);
        }
@finally {
NSLog(@"done");
        }
return 0;
    }

}

当出现异常时,会执行@catch代码块,参数NSException对象包含了异常的详细信息,name方法返回异常的名称,reason方法给出异常的详细信息。

九 变量和数据类型

1.自定义对象的初始化方法

在前面的例子中,我们创建对象并且初始化都是这样做的:

Complex *c1=[[Complex alloc] init];

[c1 setReal:10 andImaginary:20];

接下来我们自定义对象的初始化方法,一般也是以init开头。

Complex.h

@interface Complex : NSObject
@property double real,imaginary;
-(void)print;

-(void)setReal:(double)r andImaginary:(double) m;

-(Complex *)initWithReal:(double)r andImaginary:(double) m;

@end

Complex.m

#import "Complex.h"

@implementation Complex
@synthesize real,imaginary;
-(void)print
{
NSLog(@"%g + %gi",real,imaginary);
}
-(void)setReal:(double)r andImaginary:(double)m
{
real=r;
imaginary=m;

}

-(Complex *)initWithReal:(double)r andImaginary:(double)m
{
self=[super init];
if(self)
    {
        [
self setReal:r andImaginary:m];
    }
return self;
}

@end

main.m

#import "Complex.h"
int main(int argc,const char * argv[])
{

@autoreleasepool {

Complex *c=[[Complex alloc] initWithReal:10 andImaginary:20];
        [c print];

}

return 0;

}

2.静态变量

静态变量定义在所有方法之外,使用static修饰符,它属于类,而不属于类对象。例如在下面的例子中,使用gCount变量记录allocC调用次数。

Complex.h

#import <Foundation/Foundation.h>

@interface Complex : NSObject

@property double real,imaginary;

...

+(Complex *)allocC;
+(int)count;

@end

Complex.m

#import "Complex.h"
static int gCount=0;
@implementation Complex

...

+(Complex *)allocC
{
gCount++;
return [Complex alloc];
}
+(int)count
{
return gCount;
}

@end

main.m

#import "Complex.h"
int main(int argc,const char * arg[])
{
@autoreleasepool {
NSLog(@"count=%i",[Complex count]);//0
Complex *c=[[Complex allocC] init];
Complex *c1=[[Complex allocC] init];
Complex *c2=[[Complex allocC] init];
NSLog(@"count=%i",[Complex count]);//3
    }
return 0;

}

十 分类和协议

1.分类

通过分类可以很简单地向现有类添加方法,功能类似于C#的扩展方法。格式为: @interface Complex(MathOps)

例如:

①现有Complex.h定义:

#import <Foundation/Foundation.h>

@interface Complex : NSObject
@property double real,imaginary;
-(void)print;
-(void)setReal:(double)r andImaginary:(double) m;

@end

Complex.m

#import "Complex.h"
//static int gCount=0;
@implementation Complex
@synthesize real,imaginary;
-(void)print
{
NSLog(@"%g + %gi",real,imaginary);
}
-(void)setReal:(double)r andImaginary:(double)m
{
real=r;
imaginary=m;

}

@end

②现在想扩展Complex类,如下:

Complex+MathOps.h

#import <Foundation/Foundation.h>
#import "Complex.h"
@interface Complex(MathOps)
-(Complex *)add:(Complex *)c;

@end

Complex+MathOps.m

#import "Complex+MathOps.h"
@implementation Complex(MathOps)
-(Complex *)add:(Complex *)c
{
Complex *result=[[Complex alloc] init];
    result.real=self.real+c.real;
    result.imaginary=self.imaginary+c.imaginary;
return result;
}

@end

main.m调用:

#import "Complex.h"
#import "Complex+MathOps.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
        Complex *c1=[[Complex alloc] init];
        [c1 setReal:1 andImaginary:2];
        Complex *c2=[[Complex alloc] init];
        [c2 setReal:3 andImaginary:4];

Complex *c3=[c1 add:c2];

[c3 print];//4 + 6i

}
return 0;

}

这样我们就为原有的Complex类新增了add方法。

2.协议 

protocol定义一组方法,它是不属于具体某个类的,可以被任意类实现,类似于C#中的接口interface。

①定义protocal

使用@protocol指令,后面跟上协议名称,以@end指令结束。

例如:

MathProtocol.h

#import <Foundation/Foundation.h>

@protocol MathProtocol

-(id)add:(id)v;

@optional
-(id)subscribe:(id)v;

@end

其中@optional指令表示其后面的方法是可选的。

②实现protocol

在@interface行使用尖括号<>,其中加上协议的名称,然后在.m文件中实现协议中的方法即可。

Complex11.h

#import <Foundation/Foundation.h>

#import "MathProtocol.h"

@interface Complex11 : NSObject<MathProtocol>

@property int real,imaginary;
-(void)setReal:(int)r andImaginary:(int)m;

@end

Complex11.m

#import "Complex11.h"

@implementation Complex11
@synthesize real,imaginary;
-(void)setReal:(int)r andImaginary:(int)m
{
real=r;
imaginary=m;
}
-(Complex11 *)add:(Complex11 *)v
{
Complex11 *result=[[Complex11 alloc] init];
    result.real=self.real+v.real;
    result.imaginary=self.imaginary+v.imaginary;
return result;
}

@end

main.m

#import "Complex11.h"
int main(int argc,const char * argv[])
{
@autoreleasepool {
       Complex11 *c=[[Complex11 alloc] init];
        [c setReal:1 andImaginary:2];
       Complex11 *c2=[[Complex11 alloc] init];
        [c2 setReal:3 andImaginary:4];
       Complex11 *result=[c add:c2];
       NSLog(@"%i +%ii",result.real,result.imaginary);
       //检查是否遵循某项协议
       bool isprotocol=[c conformsToProtocol:@protocol(MathProtocal)];
       if(isprotocol==YES){
              NSLog(@"c confirm protocol MathProtocol");
        }
    }
return 0;

}

要想判断一个对象是否遵守某项协议,可以使用confirmsToProtocol方法。

学习ios【1】Objective-C 基本语法的更多相关文章

  1. IOS学习笔记2—Objective C—类、属性、方法

    以下是我学习IOS开发的一些笔记和心得,贴出来和大家一同分享,也希望大家能补充和纠错,共同进步 有Android和IOS开发问题也希望能和大家交流! Objective-C 1.OC是一门基于C的面向 ...

  2. 学习iOS

    最近想学习一下iOS开发,不过一点基础都没有,得先从熟悉object-C语法开始,在此把学习中的一些知识点作为记录. mac pro常用操作 学习ios[1]Objective-C 基本语法 学习io ...

  3. 学习ios(必看经典)牛人40天精通iOS开发的学习方法

    学习ios(必看经典)牛人40天精通iOS开发的学习方法 描述 这是一套从一个对iOS开发感兴趣的学员到iOS开发高手的系统.专业的课程体系.以培养企业开发真正需要的人才为目标,每个知识点都用案例来讲 ...

  4. 10 个学习iOS开发的最佳网站(转)

    10 个学习iOS开发的最佳网站 作者 jopen 2012-09-26 08:59:56 1) Apple Learning Objective C Objective-C,通常写作ObjC和较少用 ...

  5. Objective-C专题,是学习iOS开发的前奏(转)

    第一个OC的类 来源:http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html 本文目录 一.语法简介 二.用Xcode创建第一个OC的 ...

  6. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】02-准备

    在上一讲中,介绍了什么是iOS开发.说简单一点,iOS开发,就是开发运行在iPhone或者iPad上的软件.这么一说完,应该有很多人就会产生一些疑惑,比如学习iOS开发是不是一定要买iPhone?需不 ...

  7. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

    前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...

  8. 如何学习ios开发

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Franz Fang链接:http://www.zhihu.com/question/20264108/answer/3026 ...

  9. 【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2

    原文网址:http://bbs.51cto.com/thread-1099956-1.html 亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做 ...

  10. 零基础学习iOS开发

    零基础学习iOS开发不管你是否涉足过IT领域,只要你对iOS开发感兴趣,都可以阅读此专题. [零基础学习iOS开发][02-C语言]11-函数的声明和定义 摘要: 在上一讲中,简单介绍了函数的定义和使 ...

随机推荐

  1. 山东省第七届ACM省赛------Reversed Words

    Reversed Words Time Limit: 2000MS Memory limit: 131072K 题目描述 Some aliens are learning English. They ...

  2. Python作业 1

    用户有三次机会登录,登录成功,显示欢迎界面. 三次登录失败,账户被锁定,下次登录失败. 思路: 1:流程控制:for或者while循环,达到三次检测目的. 2:文件操作. 检测文档,一旦发现输入账户名 ...

  3. proxifier 3.29 key

    Proxifier 3.29 serial key :-   [Use only One ]  (Standard Edition Keys) 5EZ8G-C3WL5-B56YG-SCXM9-6QZA ...

  4. NOI 动态规划题集

    noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...

  5. 双模蓝牙CC2564调试笔记

    1.CC256X Testing Guide  官方文档WIKI地址:http://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Devi ...

  6. 安装php-amqplib(RabbitMQ的phpAPI)

    历史经验告诉我们,装逼没有好下场. 总结一下之前composer安装php-amqplib包失败的原因: composer安装的时候需要指定PHP执行文件的位置: PHP安装路径:/usr/local ...

  7. swift开发学习网站

    1.https://github.com/Aufree/trip-to-iOS#ios- 2.http://www.code4app.com/forum.php?mod=viewthread& ...

  8. ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

    问题:ObjectStateManager 中已存在具有同一键的对象.ObjectStateManager 无法跟踪具有相同键的多个对象. 解决方案:在查询的时候加上AsNoTracking()就ok ...

  9. jxl读数据库数据生成xls 并下载

    1.所需jar jxl-2.6.10.jar jxls-core-1.0-RC-3.jar jxls-reader-1.0-RC-3.jar 2. excel修改行宽度封装 SheetColumn.j ...

  10. HBase 的表结构

    HBase 的表结构 2016-10-13 杜亦舒 HBase 是一个NoSQL数据库,用于处理海量数据,可以支持10亿行百万列的大表,下面就了解一下数据是如何存放在HBase表中的 关系型数据库的表 ...