1.引言
1.1 2007苹果公司发布Object-C2.0。Object-C是C的扩展。
1.2 书本内容组织方式:第一部分:1-13 语言基础,第二部分:14-19 构成Foundation框架的种类丰富的预定义,第三部分:20-21 介绍Cocoa和Cocoa Touch框架和用ios SDK开发简单IOS应用。
框架是一组从逻辑上组合在一起的类的例程,它们使开发程序变得更加容易。
2.object-c编程
//第一个IOS程序
#import <Foundtation/Foundation.h>
int main(int argc, const char * argv[]){
@autoreleasepool{//自动释放池
NSLog(@"Programming is fun!");//调用NSLog函数并传入参数
//无@指C类型的字符串常量,有@指NSString字符串对象
}
return 0;
}
object-c源文件用.m扩展名
xcode自带静态代码分析器
还可以用unix shell编译oc源码
oc区分大小写
oc 注释同java
oc语句以分号;结束
oc返回值0表示正常结束,任何非0值通常表示出现问题
换行符\n
//显示变量值
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]){
@autoreleasepool{
int sum;
sum = 50 + 25;
NSLog(@"The sum is :%i", sum);
}
return 0;
}
//显示多变量值
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]){
@autoreleasepool{
int value1,value2,sum;
value1 = 50;
value2 = 25;
sum = value1 + value2;
NSLog(@"the sum of %i and %i is %i", value1,value2,sum);
}
return 0;
}
3.类、对象和方法
//处理分数的OC类
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]){
@autoreleasepool {
int numerator = 1;
int denominator = 3;
NSLog(@"The fraction is %i/%i", numerator, denominator);
}
return 0;
}
//处理分数-类版本
#import <Foundation/Foundation.h>
/*interface部分*/
@interface Fraction:NSObject
-(void) print;
-(void) setNumerator:(int) n;
-(void) setDenominator:(int) d;
@end
/*implementation部分*/
@implementation Fraction{
int numerator;
int denominator;
}
-(void) print{
NSLog(@"%i/%i",numerator, denominator);
}
-(void) setNumerator:(int) n {
numerator = n;
}
-(void) setDenominator:(int) d {
denominator = d;
}
@end
/*program部分*/
int main(int argc, char * argv[]){
@autoreleasepool{
Fraction *myFraction;
//创建一个分数实例
myFraction = [Fraction alloc];
myFraction = [myFraction init];
//设置分数为1/3
[myFraction setNumerator:1];
[myFraction setDenominator:3];
//使用打印方法显示分数
NSLog(@"The value of myFraction is :");
[myFraction print];
}
return 0;
}
/*******************分析*********************/
程序在逻辑上分为三部分:
@interface部分:用于描述类和类的方法
@implementation部分:用于描述数据(类对象的实例变量存储的数据),并实现在接口中声明方法的实际代码
program部分:实现了程序的预期目的
注:也可以在interface(接口)部分为类声明实例变量
@interface部分:
类名以大写字母开头
@interface NewClassName:ParentClassName
propertyAndMethodDeclaractions;
@end
例:
@interface Fraction:NSObject
-(void) print;
-(void) setNumber:(int) n;
-(void) setDenominator:(int) d;
@end
注:新类的名称为Fraction,其父类为NSObject,NSObject类在文件NSObject.h中定义,导入Foundation.h文件时会在程序中自动包括这个类。
开头负号通知OC编译器,该方法是一个实例方法。正号表示类方法,类方法是对类本身执行某些操作的方法,如创建类的新实例。
实例方法能够对类的实例执行一些操作,如设置值,检索值,显示值。
返回值:返回类型放入开头的负号或正号之后的圆括号
方法的参数:如:
-(void)setNumerator:(int) n;
-(void)setDenominator:(int) d;
方法名以冒号结束表示该方法有带参数,无冒号时表示没有参数。
@implementation部分:
包含声明在@interface部分的方法的实际代码,且要指定存储对象中的数据类型。
@implementation NewClassName{
memberDeclarations;//指定了哪种类型的数据要存入Fraction中
}
methodDefinitions;
@end
注:NewClassName表示名称与@interface部分的名称相同。可以在父的名称之后使用冒号,如在@interface部分使用冒号一样:
@implementation Fraction:NSObject
但它是可选的。
这部分声明的成员为实例变量。每次创建新对象时将同时创建一组新的实例变量,而且是唯一的一组。如果有两个Fraction,一个是FractionA,另一个是FractionB,那么每一个都将有自己的一组实例变量。
@implementation部分中的methodDefinitions部分包含在@interface部分指定的每个方法的代码中。
@program部分:包含解决特定问题的代码,可以跨越多个文件。
如果向某个类发送alloc消息便获取该类的新实例。
简写形式:通常把创建和初始化直接合并到声明行:
Fraction *myFraction = [[Fraction alloc] init];
Xcode4.2后版本,自动引用计数ARC(Automatic Reference Counting)的机制可以依靠系统自动释放内存,默认开启ARC。
//使用多个分数
#import <Foundation/Foundation.h>
@interface Fraction:NSObject
-(void)print;
-(void)setNumerator:(int) n;
-(void)setDenominator:(int) d;
@end
@implementation Fraction{
int numerator;
int denominator;
}
-(void)print{
NSLog(@"%i/%i",numerator,denominator);
}
-(void)setNumerator:(int) n{
numerator = n;
}
-(void)setDenominator:(int)d{
denominator = d;
}
@end
int main(int argc, char *argv[]){
@autoreleasepool{
Fraction *frac1 = [[Fraction alloc] init];
Fraction *frac2 = [[Fraction alloc] init];
}
//设置第一个分数2/3
[frac1 setNumerator:2];
[frac1 setNumerator:3];
//设置第一个分数3/7
[frac1 setNumerator:3];
[frac1 setNumerator:7];
//显示分数
NSLog(@"First fraction:");
[frac1 print];
NSLog(@"Second fraction:");
[frac2 print];
}
return 0;
}
4.数据类型和表达式
//基本数据类型
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]){
@autoreleasepool{
int integerVar = 100;
float floatVar = 331.79;
double doubleVar = 8.33e+11;
char charVar = 'u';
NSLog(@"integerVar = %i", integerVar);
NSLog(@"floatVar = %f", floatVar);
NSLog(@"doubleVar = %e", doubleVar);
NSLog(@"doubleVar = %g", doubleVar);
NSLog(@"charVar = %c", charVar);
}
return 0;
}
注:限定词:long, long long, short, unsigned, signed.
id类型:id数据类型可存储任何类型的对象。某种程序上是一般对象类型。如:
id graphicObject;//将graphicObject声明为id类型的变量
可以声明方法使其具有id类型的返回值,如:
-(id) newObject:(int) type;//声明一个名为newObject的实例方法,具有名为type的单个整形参数并有id类型的返回值。
id类型是多态和动态绑定的基础。
//简单四则运算器,实现Calculator类
#import <Foundation/Foundation.h>
@interface Calcutor:NSObject
//累加方法
-(void) setAccumulator:(double)value;
-(void)clear;
-(double)accumulator;
//算术方法
-(void)add:(double)value;
-(void)subtract:(double)value;
-(void)multiply:(double)value;
-(void)divide:(double)value;
@end
@implementation Calculator{
double accumulator;
}
-(void) setAccumulator:(double)value{
accumulator = value;
}
-(void)clear{
accumulator = 0;
}
-(double)accumulator{
return accumulator;
}
-(void) add: (double) value{
accumulator += value;
}
-(void) subtract: (double) value{
accumulator -= value;
}
-(void)multiply:(double)value{
accumulator *= value;
}
-(void) divide:(double)value{
accumulator /= value;
}
@end
int main(int argc, cahr *argv[]){
autoreleasepool{
[deskCalc setAccumulator:100.0];
[deskCalc add:200.];
[deskCalc subtract:10.0];
[deskCalc multiply 5];
NSLog(@"the result is %g",[deskCalc accumulator]);
}
return 0;
}
5.循环结构
for循环.while循环. do循环
//计算8个三角数
#import <Foundation/Foundation.h>
int main(int asgc, char *argv[]){
@autoreleasepool{
int trangularNumber;
triangularNumber = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8;
NSLog(@"The eight triangular number is %i", triangularNumber);
}
return 0;
}
//计算第200个三角数和程序
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]){
@autoreleasepool{
int n, triangularNumber;
triangularNumber = 0;
for( n = 1; n <= 200; n = n+1){
triangularNumber += n;
}
NSLog(@"The 200th triangular number is %i", triangularNumber);
}
return 0;
}
//键盘输入
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]){
@autoreleasepool{
int n,number, triangularNumber;
NSLog(@"Whar triangularNumber do you want?");
scanf("%i", &number);
triangularNumber = 0;
for(n = 1; n <= number; ++n){
triangularNumber += n;
}
NSLog(@"Triangular number %i is %i\n", number, triangularNumber);
}
return 0;
}
break循环:跳出当前循环,如果有多层循环则跳出本层循环体。
continue:跳出本次循环。
6.选择结构
if语句,switch语句,conditional运算符
//生成素数表
#import <Foundation/Foundation.h>
int main(int argc, char * argv[]){
@autoreleasepool{
int p, d, isPrime;
for( p = 2; p <= 50; ++p){
isPrime = 1;
for(d = 2; d < p; ++d){
if(p%d == 0){
isPrime = 0;
}
if(isPrime != 0){
NSLog(@"%i", p);
}
}
}
}
return 0;
}
7.类
分离接口和实现文件:
//接口文件Fraction.h
#import <Foundation/Foundation.h>
@interface Fraction: NSObject
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
-(double) convertToNum;
@end
Fraction类的实现细节需要输入到文件Fraction.m中
#import "Fraction.h"
@implementation Fraction {
int numerator;
int denominator;
}
-(void) print{
NSLog(@"%i/%i", numerator, denominator);
}
-(void) setNumerator: (int) n{
numerator = n;
}
-(void) setDenominator:(int) d{
denominator = d;
}
-(int) numerator{
return numerator;
}
-(int) denominator{
return denominator;
}
-(double) convertToNum{
if(denominator != 0){
return (double) numerator/denominator;
}else{
return NAN;
}
}
@end
合成存取方法:
自动生成存取方法:在接口部分中使用@property指令标识属性:
如:新接口添加@property指令
@interface Fraction: NSObject
@property int numerator, denominator;
-(void) print;
-(double) convertToNum;
@end
//让OC编译器自动生成存取方法:在实现部分使用@synthesize
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;//通知OC编译器为这两个属性生成存取方法
-(void)print{
NSLog(@"%i/%i",numerator,denominator);
}
-(double) convertToNum{
if(denominator != 0){
return (double) numerator /denominator;
}else{
return NAN;
}
}
@end