Extends Coc 、EnhancedCc++/ 、C-like c#
会在github上开源一个库,如果是私有库要交钱,自己o公司的项目不要勾
会把源代码提交上去
<span style="font-size:14px;">//引入头文件
//C中引入头文件的方式
//系统为尖括号<> include也可以用
//#include<Foundation/Foundation.h>
//import引入的头文件可以防止重复包含 include使用预处理指针防止重复包含
// import和 @class区别
//<Foundation/Foundation.h>
//1./Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
//oc的库文件都引过来了
#import<Foundation/Foundation.h>
// 参数数目 参数值
int main(intargc,const char* argv[]) {
@autoreleasepool {
//@autoreleasepool自动释放池,用于回收对象的存储空间(内存管理范畴)
//insert code here...
NSLog(@"Hello, World!");//日志输出函数
}
return 0;
//0表示正常退出
}
</span>
一.NSLog和NSString基本认识
NSLog Cocoa框架中提供一个方法
NSLOG定义在NSObjCRuntime.h中
传递进去的是NSString格式化字符串
#import<Foundation/Foundation.h>
int main(intargc,const char* argv[]) {
@autoreleasepool {
//insert code here...
NSLog(@"Hello,World!");
//NSLog包含换行符
//NSLog会打印日志时间,名称等项目信息
//NSLog函数参数是一个NSString对象
//printf是一个字符串常量指针
//NSlog格式化输出问题
int a = 5 ;
NSLog(@"%d",a);
char *str ="黑马程序员";
NSLog(@"---->%s",str);
//OC中自己特有字符串表示方法
NSString *str1 = @"abc";
NSLog(@"%@",str1);
printf("%s",str1);//
//printf不能打印NSString对象
//向下兼容
}
return 0;
}
2015-11-23 09:36:17.912 NSLOG函数[10643:1425615] Hello, World!
2015-11-23 09:36:17.913 NSLOG函数[10643:1425615] 5
2015-11-23 09:36:17.914 NSLOG函数[10643:1425615] ---->
2015-11-23 09:36:17.914 NSLOG函数[10643:1425615] abc
X\354\377
C的模块化编程在OC中也适用
OC的数据类型
//OC提供一种增强型for循环
#import<Foundation/Foundation.h>
int main(intargc,const char* argv[]) {
@autoreleasepool {
NSArray *arr =@[@"one",@"two",@"Three"];
for (NSString*str in arr) {
NSLog(@"%@",str);
}
}
return 0;
}
定义和声明的差异
OC称函数为方法没有函数的概念
+(void)test;
-(void)test;
-(int)max:(int)x and Y:(int)y;同 int max(int x,int y)
OC新增数据类型
1)逻辑型
Boolean 可取trueorfalse,也可以用 0或非0整数代替
boolean是int型
Boolean是char型
BOOL是unsigned char型,BOOL b当b=1 b=YES
bool 是int型,bool b 当b>1 b=YES
bool t1 =1;//true or false
BOOL t2 = 3;//YES or NO
Boolean t3 =1; //unsigned char type
boolean_t t4 = 1;//int type
NSAssert(t1,@"bool t1 is NO");//通过测试
NSAssert(t2,@"BOOL t2 is NO");//通过测试
NSAssert(t3,@"Boolean t3 isNO");//通过测试
NSAssert(t4,@"boolean_t t4 isNO");//通过测试
typedefunsignedchar Boolean;
typedefsigned charBOOL;
#definebool _Bool
看底层,需要C语言基础
说明:objective-c中的BOOL实际上是一种对带符号的字符类型(signed char)的类型定义(typedef),它使用8位的存储空间。通过#define指令把YES定义为1,NO定义为0。
注意:objective-c并不会将BOOL作为仅能保存YES或NO值的真正布尔类型来处理。编译器仍将BOOL认作8位二进制数,YES和 NO值只是在习惯上的一种理解。
问题:如果不小心将一个大于1字节的整型值(比如short或int)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。如果该低位字节刚好为0(比如8960,写成十六进制为0x2300),BOOL值将会被认作是0,即NO值。而对于bool类型,只有true和false的区别,即0为false,非0为true。
举例:
BOOL b1=8960; //实际是 NO,因为8960换成十六进制为0x2300,BOOL只有8位存储空间,取0x2300的低8位,00,所以是NO
bool b2=8960;//实际是true,因为bool类型,非0即为true。
二.面向对象:
采用基于对象的概念建立模型,莫尼克客观事件的系统思维方式,分析,设计实现软件的方法。
1).面向过程:解决软件复用和设计编程的方法
2).面向对象三个特性:
封装,
多态,
继承
抽象(基础班没有讲)
区别
面向过程:强调的是功能行为, 关注的是解决问题需要哪些步骤
面向对象:
将功能封装对象,强调具备了功能的对象
关注的是解决问题需要哪些对象
面向对象时基于面向过程的
类是一类具有相似内部状态(共同特征)和运动规律的实体集合
对象各种各样的实体,具有相同类型的类的抽象例如:整数123苹果,水杯,具有相似内部状态和运动规律
消息对象之间相互联系和相互作用的方式
一个类可以实例化多个对象
类的构成:
名称、属性、行为
类的抽象 (拥有相同或者类似属性和行为的对象抽象出一个类)
方法:名词提炼成一个类
类:
鸟,猪,障碍物(箱子,石头,炸药),地图(背景)
属性:
颜色大小
行为:
扔爆炸显示分数
类,包,接口,继承,对象,多态
3).类的声明和实现
[Car new];
//1.向计算机申请内存空间
//2.给类中的每一个成员初始化值
//3.返回新申请空间的首地址
Car *car =[Car new];
//理解方式1
//定义了一个Car类型指针变量
//指针变量指向新申请的内存空间
//理解方式2
//用Car类实例化一个实例对象,对象名称是car
4).无参方法的声明和实现
//
// main.m
// 类的声明和实现
//
// Created by CHINGWEI_MACPC on 15/11/23.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>
@interface Car :NSObject
{
//类的属性
@public;//默认不添加,无法访问
int wheel ;
NSString *color ;
int speed ;
}
//类的行为
-(void) run;//定义一个无参无返回值的方法
-(void) stop;
@end
//类的实现
@implementation Car
//行为具体描述
//方法的具体实现
// '-'开头为对象方法,只能用对象调用
-(void) run{
NSLog(@"车在行驶中...");
}
-(void) stop{
NSLog(@"到达目的地,车停止运行");
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Car *car1 = [Car new];
car1->color=@"blue";
car1->speed=150;
car1->wheel=4;
NSLog(@"轮子:%d,速度:%d,颜色:%@",
car1->wheel,car1->speed,car1->color);
//方法调用
[car1 run];
[car1 stop];
}
return 0;
}
//
// main.m
// 有参方法的声明和实现
//
// Created by CHINGWEI_MACPC on 15/11/23.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>
@interface Calculator:NSObject
{
@public;
int num3 ,num4;
}
-(int)sum:(int)num1 and:(int)num2;
-(int)sum2;
@end
@implementationCalculator
//方法名 sum: and:
-(int)sum:(int)num1 and:(int)num2{
return num1 + num2 ;
}
-(int)sum2{
return num3+ num4 ;
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Calculator *cal1 = [Calculator new];
cal1->num3 = 34;
cal1->num4 = 35;
int result = [cal1 sum:cal1->num3and:cal1->num4];
NSLog(@"%d",result);
result = [cal1 sum2];
NSLog(@"%d",result);
}
return 0;
}
// Iphone类声明
//
// Created by CHINGWEI_MACPC on 15/11/23.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>
typedefenumcolor{kColorWhite,kColorBlack,kColorGold} iColor;
@interface Iphone:NSObject{
//类的属性(实例变量,成员变量)
//手机颜色
@public;
iColor _color ;
float _size ;
NSString *_cpu;
}
//类的行为(方法)
//查看手机的信息,实质:把手机的实例值打印出来
-(void)aboutMyPhone;
-(void)callPhone:(NSString*)telNum;
-(void)sendMessage:(NSString*)telNum andContent:(NSString*) content;
@end
@implementation Iphone
-(void)aboutMyPhone{
NSLog(@"颜色:%d,大小:%.2f,cpu:%@",_color,_size,_cpu);
}
-(void)callPhone:(NSString*)telNum{
NSLog(@"对方电话号码:%@",telNum);
}
-(void)sendMessage:(NSString*)telNum andContent:(NSString*) content{
NSLog(@"发短信至:%@,短信内容:%@",telNum,content);
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Iphone *ip7 = [Iphone new];
ip7->_color=kColorBlack;
ip7->_cpu=@"A10";
ip7->_size=5.7f;
[ip7 aboutMyPhone];
[ip7sendMessage:@"10086"andContent:@"剩余流量"];
[ip7 callPhone:@"13800138000"];
}
return 0;
}
2015-11-23 16:29:23.879 Iphone类声明[1043:72539]颜色:1,大小:5.70,cpu:A10
2015-11-23 16:29:23.880 Iphone类声明[1043:72539]发短信至:10086,短信内容:剩余流量
2015-11-23 16:29:23.880 Iphone类声明[1043:72539]对方电话号码:13800138000
Program ended with exit code: 0
#import<Foundation/Foundation.h>
@interface WalkToKeepFit:NSObject
{
@public;
int steps ;
float fat;
}
-(float)cutFat;
-(float)eat:(int)times;
@end
@implementationWalkToKeepFit
-(float)cutFat{
float curentFat = fat;
NSLog(@"curentFat= %f",curentFat);
while (steps/100) {
curentFat-=0.2f;
steps-=100;
}
return curentFat;
}
-(float)eat:(int)times{
fat = fat+times*0.6f;
return fat ;
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
WalkToKeepFit *wtf = [WalkToKeepFit new];
wtf->fat = 3.f;
[wtf eat:3];
wtf->steps =350;
float curFat =[wtf cutFat];
NSLog(@"now fat is %.2f",curFat);
}
return 0;
}
老师代码
#import<Foundation/Foundation.h>
@interface Person:NSObject
{
@public;
NSString *_name ;
int _age ;
float _weight;
}
//功能是人可以吃各种食物
//每次散步,让体重-0.2
-(void)walk:(int)steps;
-(void)eat:(NSString*)foodName;
@end
@implementation Person
-(void)walk:(int)steps{
_weight-=steps/100*0.2f;
NSLog(@"%@您走了%d步,您当前体重为 %f",_name,steps,_weight);
}
-(void)eat:(NSString*)foodName{
_weight += 0.6f;
NSLog(@"您吃了 %@",foodName);
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Person *person1 = [Person new ];
person1->_weight=180.f;
person1->_age = 30;
person1->_name=@"jack";
[person1eat:@"橘子"];
[person1 walk:600];
}
return 0;
}
对象的存储细节
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有自己的单独成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身再内存中占据一份存储空间,类的方法存储于此。
//1.申请的空间在内存的哪个区
//new的时候申请的空间在内存的堆区(程序动态分配的内存空间)
//_isa指针存放此内存堆区的类属于哪个代码区类的地址
//2.实例变量又保存在什么地方
// person1(指针变量名)是局部变量存放在栈区p指向内存堆区的空间
,[person1 new ]在堆中开辟一个内存空间
//3.对象方法保存在什么地方
//代码区域
//4.为什么使用[person1 run]就可以调用方法?如何调用的
//根据p的地址找对应的堆区的空间,在堆区的_isa指针,再到_isa指向的代码区,然后在对应的空间找到run方法
5).一个类创建多个对象
#pragma mark
方便代码的查找和导航
多一条分割线,方便代码导航
三、函数和对象方法的区别
对象方法
对象方法只能对象调用[person1run];
对象方法归对象所有,不能这个类调用另一个类的方法
类方法只能由类调用
-(void)run;
函数在@interface和 @end之间也能被调用,属于整个文件,写在文件的任何位置,都可以被调用
所有函数属于平行关系
不可以访问对象中的成员变量
void run(){
}
四、常见错误汇总
(1).@interface @end @implementation @end不能嵌套
声明和实现必须同时存在
两个类的声明实现的顺序可以打乱
(2).声明的时候不能对类的成员变量初始化,成员变量不能脱离对象而存在
(3).成员变量和方法不能用static等关键字修饰(@public @protocal @private)
(4).类的实现可以写在main函数之后,
(5).定义了成员方法却没实现
加入异常捕捉代码,将异常结果exception 打印出来
#import<Foundation/Foundation.h>
typedefenum{KSexMan,KSexWoman,KSexChild} iSex;
@interface Person:NSObject
{
@public;
NSString *_name ;
int _age ;
iSex _sex ;
}
-(void)run:(Person*)person;
-(Person *)change:(Person*)person;
@end
@implementation Person
//对象方法参数为对象的情况
-(void)run:(Person*) person{
NSLog(@"姓名:%@,性别:%d",person->_name,person->_age);
}
//返回值为对象的情况修改对象的性别
-(Person *)change:(Person*)person{
person->_sex=KSexWoman;
return person;
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Person *p = [Personnew];
Person *p1 = [Person new];
p1->_name=@"liniu";
p1->_sex=KSexWoman;
Person *p2 = [Person new];
p2->_name=@"Qiniu";
p2->_sex=KSexMan;
[p run:p1];
[p run:p2];
Person *p3 = [Person new];
p3 = [p change:p2];
NSLog(@"姓名:%@,性别:%d",p3->_name,p3->_sex);
}
return 0;
}
#import<Foundation/Foundation.h>
#pragma mark人的类声明和实现
#pragmamark -
#pragma mark狗类的声明和实现
typedefenum{KColorWhite,KColorYellow,KColorBlack} iColor;
typedefenum{KSexMale,KSexFeMale} iSex;
@interface Dog:NSObject{
@public;
iColor _color ;
float _weight ;
iSex _sex ;
int _speed ;
}
-(void)eat:(NSString*)foodName;
-(void)run;
-(void)bark;
-(BOOL)isCompareColorWithOther:(Dog *)dog;
-(int)CompareSpeedWithOther:(Dog *)dog;
@end
#pragmamark -
#pragma mark人的类声明和定义
@interface Person:NSObject{
@public;
NSString *_name ;
Dog *_dog;
}
-(void)feedDog:(NSString*)foodName;
-(void)walkTheDog;
@end
@implementation Person
-(void)feedDog:(NSString*)foodName{
[_dogeat:foodName];
}
-(void)walkTheDog{
[_dogrun];
}
@end
@implementation Dog
-(void)eat:(NSString*)foodName{
_weight+=0.5f;
NSLog(@"正在吃东西:%@",foodName);
}
-(void)run{
_weight-=0.5f;
NSLog(@"正在以%d的速度跑步",_speed);
}
-(void)bark{
NSLog(@"%d,%d,%f",_color,_sex,_weight);
}
-(BOOL)isCompareColorWithOther:(Dog *)dog{
if (_color ==dog->_color) {
return YES;
}
else
return NO;
}
-(int)CompareSpeedWithOther:(Dog *)dog{
return _speed -dog->_speed;
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Dog *d1 =[Dognew ];
d1->_speed = 80;
d1->_weight = 20;
d1->_sex =KSexFeMale;
d1->_color =KColorBlack;
Person *p = [Personnew ];
// [p feedDog:@"肉骨头"];无法调用方法
//相当于nil->feedDog
p->_dog =d1;
[pfeedDog:@"肉骨头"];
}
return 0;
}
2).对象作为方法的参数连续传递
//
// main.m
// 对象作为方法的参数连续传递2
//
// Created by CHINGWEI_MACPC on 15/11/25.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>
#pragmamark -
#pragma mark子弹声明
#pragma mark子弹实现
@interface Bullet:NSObject{
@public;
int _bulletCount;
NSString *_size ;
}
@end
@implementation Bullet{
}
@end
#pragma mark枪类声明
#pragma mark枪类实现
@interface Gun:NSObject{
@public;
NSString *_size ;
}
-(void)shoot:(Bullet*)_bullet;
@end
@implementation Gun
-(void)shoot:(Bullet*)_bullet{
if(_bullet->_bulletCount){
_bullet->_bulletCount--;
NSLog(@"%@的枪正在射击还剩下%d子弹",_size,_bullet->_bulletCount);
}
else{
NSLog(@"子弹没了,请上子弹");
}
}
@end
#pragmamark -
#pragma mark士兵声明
#pragma mark士兵实现
@interface Soilder:NSObject{
@public;
NSString *_name ;
int _life;
int _level ;
}
-(void)fireByGun:(Gun*)_gun andBullet:(Bullet *)bullet;
@end
@implementation Soilder
-(void)fireByGun:(Gun*)_gun andBullet:(Bullet *)bullet{
[_gun shoot:bullet];
}
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Soilder *s =[Soildernew];
s->_name =@"yui";
s->_life=98;
s->_level =2 ;
Gun *gun = [Gunnew ];
gun->_size=@"小米3";
Bullet *myBullet = [Bullet new];
myBullet->_bulletCount =3;
myBullet->_size=@"854";
[s fireByGun:gun andBullet:myBullet];
[s fireByGun:gun andBullet:myBullet];
[s fireByGun:gun andBullet:myBullet];
[s fireByGun:gun andBullet:myBullet];
//mybullet作为对象参数传递两次
}
return 0;
}
2015-11-25 18:53:59.672对象作为方法的参数连续传递2[7005:783801]小米3的枪正在射击还剩下2子弹
2015-11-25 18:53:59.674对象作为方法的参数连续传递2[7005:783801]小米3的枪正在射击还剩下1子弹
2015-11-25 18:53:59.674对象作为方法的参数连续传递2[7005:783801]小米3的枪正在射击还剩下0子弹
2015-11-25 18:53:59.675对象作为方法的参数连续传递2[7005:783801]子弹没了,请上子弹
Program ended with exit code: 0
错误写法,因为car1并不知道{ }是数组初始化还是结构体初始化,所以报错
强制转换成struct类型就可以=
用结构体变量作为对象变量传递
#import<Foundation/Foundation.h>
typedefstruct {
int year ;
int month ;
int day ;
}myDate;
@interface Student:NSObject{
@public;
NSString *_name ;
//学生生日结构体
myDate _birthday ;
}
@end
@implementation Student
@end
int main(intargc,const char* argv[]) {
@autoreleasepool {
Student *student = [Student new];
//方法1
student->_birthday = (myDate){1983,12,12};
//方法2
myDate d1 ={1983,12,12};
student->_birthday = d1;
NSLog(@"%d,%d,%d",student->_birthday.year,student->_birthday.month,student->_birthday.day );
//方法3
student->_birthday.year = 1983;
student->_birthday.month = 12;
student->_birthday.day = 12 ;
}
return 0;
}
3).Nstring类介绍及用法
#import<Foundation/Foundation.h>
int main(intargc,const char* argv[]) {
@autoreleasepool {
//OC 字符串处理的类
//方法1
NSString *abc =@"this is astring";
NSLog(@"%@",abc);
//方法2
NSString *str = [NSString new];
str = @"sdwe";
NSLog(@"%@",str);
//方法3格式化创建字符串
//02d占位符占用2位
for(inti = 0 ;i < 10;i++){
NSString *imgName = [NSString stringWithFormat:@"xxxx%02d.jpg",i];
NSLog(@"%@",imgName);
}
//方法4用一个已经存在的字符串创建一个新的字符串
NSString *str2 = [[NSString alloc] initWithString:str];
NSLog(@"%@",str2);
}
return 0;
}
// Nsstring字符串长度计算
//
// Created by CHINGWEI_MACPC on 15/12/1.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>
int main(intargc,const char* argv[]) {
@autoreleasepool {
NSString *abc = @"this is astring";
//intlen = (unsigned)[abc length];
//NSLog(@"%d",len);
NSUInteger len = [abc length];
NSLog(@"%ld",len);//16
//OC中,字符串都是一个字符和英文一样
NSString *chinese =@"中文";
len = [chinese length];
NSLog(@"%ld",len);//2
//OC中,字符串都是中文字符和英文一样
NSString *str3 =@"中文!";
//intlen = (unsigned)[abc length];
//NSLog(@"%d",len);
len = [str3 length];
NSLog(@"%ld",len);//3
//而c语言在UTF-8中一个汉字占用3个字节
}
return 0;
}
4).多文件开发创建类