黑马程序员-OC语言基础学习(一)

---------------------- IOS培训.期待与您交流! ----------------------

OC语言学习笔记一
---既然决定14年要好好的努力一次,那么就不要再轻言放弃,不再在随波逐流。只有努力过、拼搏过,才会知道自己行还是不行!为自己加油!---
---总结的知识点可能有不正确的地方,如果有发现请留言给我,我一定及时更正,不让错误的知识去误导大家,有好的意见也可大声提出来,小弟一定愿意采纳---


OC Objected-C 面向对象的C
完全兼容C 在C的基础上,增加一层面向对象的语法 可以在OC中嵌入C C++代码

OC语法预览
1、关键字:基本所有关键字都是以@开头
2、字符串:字符串以@开头    如 @"Hello" OC中的字符串  C中字符串为"Hello"
3、OC基本数据类型:char、 int 、float、double 。BOOL(YES\NO) 布尔类型(OC特有)
nil   相当于C语言中的null 就是 0;
基本语句 循环,条件与C一致
注释 与C一致
屏幕输出  OC中为NSLog 不是printf   NSLog(@"Hello world")  NSLog(@"%i", 27)

4、OC开发编译流程   文件名.m(源文件)   --编译(生成二进制文件)-->  文件名.o (目标文件)  --链接-->  a.out (可执行文件)
C开发编译流程   文件名.c(源文件)   --编译(生成二进制文件)-->  文件名.o (目标文件)  --链接(将OC函数库打包在一起)-->  a.out (可执行文件)
两者之间的区别主要在于: 1、源文件是不同类型的;
2、在链接时,OC不会将函数一起打包到可执行文件中;但是C语言会将函数一起打包
3、在OC链接的时候需要主动告诉编译器引用的头文件
如 编译 cc -c firstOC.c  链接: cc firstOC -framework Foundation  执行:./a.out
其中程序中用到了Foundation框架中的函数,所以在链接时需要指定框架,这也是与C不同的地方。
.mm 的文件可以编写 C C++ OC

5、第一个OC程序
NSLog 输出内容会自动换行
#import 的用途
1)、跟#include 一样,拷贝文件的内容。
2)、可以自动防止文件内容被重复拷贝,省去了在C语言中声明头文件时必须要用的预处理指令
#ifndef ABC
#define ABC
coding....
#endif

#import <Foundation/NSObjCRutime.h>   引用Foundation框架中的NSObjCRutime 头文件
Foundation 是框架的意思  

查看框架头文件源码:
首先找到Xcode的应用程序,然后打开包,(下面的平台是iPhoneOS6.1.sdk平台的框架头文件)
/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/Foundation.framework

框架中主要的UIKit.framework、QuartzCore.framework 其中Foundation.framework 框架是基础

每个框架都有自己的主头文件.主头文件是最主要的头文件,切主头文件的名与框架相同。引用主头文件就能使用框架下的所有文件。
6、OC中的BOOL类型
BOOL类型本质:typedef signed char BOOL;
BOOL类型变量2种取值 YES NO
系统通过宏定义,并强转 YES 即为 1 NO 即为 0
#define YES (BOOL) 1
#define NO (BOOL) 0
BOOL类型输出(当作整数来用)  NSLog(@"%d", YES/NO);
注意需要全部大写 BOOL b = YES;
7、面向对象AND面向过程
面向过程关注的是解决问题需要那些步骤,面向对象关注的是解决问题需要那些对象。
8、类和对象
类名第一个字母必须大写,不能有下划线,多个英文单词,用驼峰标识
9、OC程序编写实例一:
类的声明(用来声明对象的属性)
@interface Animal : NSObject
{
//@public 可以让外部的指针间接访问对象内部的成员变量,后面的所有变量都可以访问,不需要一一的添加@public
@public  
int age;  //定义的成员变量,系统默认初始值为0;
}

/*
OC方法的声明不不需要被{}括住,所以注意变量和方法声明时的位置
方法(行为): 方法名、参数、返回值(声明、实现)
只要是OC对象的方法,必须以减号 - 开头
OC方法中任何数据类型都必须用小括号() 扩住
OC方法中的小括号() : 括住数据类型
*/
- (void) run;  //正确方式
- void run();   //错误的

定义带参数的切返回double类型方法(OC方法中一个参数对应一个冒号,切括号只能括数据类型)
- (double) fangfa :(int) a;
- (int)fangfa:(int)a :(int)b;
[jsp fangfa:10 :5];           注意添加空格

@end   //表示类声明结束

// : NSObject目的是 让Animal这个类具备创建对象的能力 (NSObject 父类,存放在Foundation框架中)

类的实现(用来实现@interfac中声明的方法)
@implementation Animal
//注意实现方法时,外层不需要{}括住了。
//方法的实现
- (void) run
{
NSLog(@"动物都会奔跑");
}

@end    //类的实现结束

int main()
{
/*
在OC中,想执行一些行为,就写上一个中括号 [行为执行者(对象) 行为名称(方法)]
利用类来创建对象
执行Animal这个类的new行为(方法)来创建新对象
*/
[Animal new]; 

/*
定义一个指针p,p将来指向的是Animal类型的对象
[Animal new] 会创建出一个新对象,并且会返回新对象本身(新对象的地址)
*/
Animal *p = [Animal new]; 

/*
给p所指向对象的age属性赋值。赋值方式为结构体的形式
*/
p->age = 19;

/*
给p指向的对象发送一个run消息,即通过对象p调用run方法执行
*/
[p run];

return 0;
}


/**
OC中想修改对象、操作对象只能用指针
OC对象的本质就是结构体
**/
10、OC程序编写实例二:
@interface Person : NSObject
{
@public
int age;
int weight;
}

- (void) walk;
@end

@implementation Person

- (void) walk
{ 
/* 
对象调用时,访问的方法可以直接使用他内部的变量。
(对象在创建时,对象自身内存会包含方法、对象,所以当对象调用方法时,方法是可以直接使用对象内部的变量的)
*/
NSLog(@"%i岁的人,%f斤,正在走路", age, weight);
}
@end

int main()
{ 
/*
在使用类创建对象之前,会将类加载进内存中,切只加载一次,被对象之间公用。
每个对象本身都带有一个isa指针,通过这个指针就可以找对所属的类
*/
Person *p = [Person new];
p->age = 20;
p->weight = 50.5;
[p walk];

return 0;
}



11、常见错误:
@interface 与 @implementation 之间不能嵌套
方法的实现不能写在@interface中。
在定义的@interface 与 @implementation之间不能嵌套任何东西
@interface
@end
@implementation
@end
在@interface中声明成员变量(实例变量) 不允许在这里初始化
在@interface中声明成员变量(实例变量) 不能随便将成员变量当作C语言中的变量来使用,比如加个static修饰之类的动作
@interface需要放在被调用的前边,具体实现可以放在后面。就是需要先在内存中定义了,才能调用。

12、OC的方法和函数区别
(在参数传递时,形参会在使用时,在系统中创建临时的内存空间)
OC的方法必须在@interface @end中声明在@imlementation @end中定义; 对象方法归类、对象所有
函数则不需要,函数可以写在文件中的任何地方(@interface @end 之间除外),函数归文件所有。

@imlementation Person
- (void) fangfa //OC方法
{
hanshu();   //在方法中调用函数
}
void hanshu();   //OC函数
@end

对象方法都是以减号 - 开头
对象方法只能由对象调用,需要实例对象
函数不能直接访问在@interface @end中定义的实例变量
函数不依赖对象
13、OC程序练习

#import <Foundation/Foundation.h>
typedef enum{
    SexMan,             //注意枚举中的可以选择的数据,所有用逗号分隔.
    SexWoman
} Sex;
                        //注意枚举和结构体中的区别
typedef struct {
    int year;
    int month;
    int day;
} Date;

@interface Dog : NSObject
{
@public
    int weighe;
}
- (void) eat;
@end
@implementation Dog
- (void) eat
{
    NSLog(@"通过学生方法调用dog的吃方法");
}

@end

@interface Student: NSObject
{
    @public
    char *name;
    int age;
    Sex sex;  //性别只有男女,所以定义为枚举类型,只取这两个数值就好
    Date birthday;   //生日,定义成结构体
    Dog *d;  //重点在学生对象中包括狗的对象 为指针
}
- (void) stady;
- (void) feedDog;
@end

@implementation Student
- (void) stady
{
    NSLog(@"%s同学,性别%d,%i岁,  出生于 %d-%d-%d", name,sex,age,birthday.year,birthday.month,birthday.day);
    //注意这里在使用结构体中的数据时不能用 -> 
}
- (void) feedDog
{
    [d eat];  // 调用狗的吃方法
}
@end

int main()
{
    Student *s = [Student new];
    s->name = "Tom";
    s->age = 23;
    s->sex = SexMan;
    s->birthday.year = 2011;
//    s.birthday.month = 02;   //这样 调用是不对的
    s->birthday.month = 02;
    s->birthday.day = 20;
//    s->birthday->day = 25;   //错误
    
    [s stady];
    
    /*上面的时对学生进行操作,下面通过学生来让狗吃东西*/
    //创建狗的实例给学生中的指针
    Dog *d = [Dog new];
    d->weighe = 20;
    s->dog = d;
    
    [s feedDog];
    
    return 0;
}



14、OC方法名
- (double) pi;
//方法名 pi
- (int) test:(int)num;
//方法名 test:  (OC中冒号也是方法名的一部分)
- (int) sumWithNum1:(int)num1 andNum2:(int) num2;
//方法名 sumWithNum1:andNum2:
15、@interface @end @implementation @end 是成对出现的哦
16、比较两个车的速度,分别用函数和方法
#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    @public
    int speed;
}
- (int) compareSpeed:(Car *) c1;
@end
@implementation Car


- (int) compareSpeed:(Car *) c1
{
    return speed - c1->speed;
}

@end

int compare(Car *c1,Car *c2);

int main()
{
    Car *c = [Car new];
    c->speed = 90;
    Car *c1 = [Car new];
    c1->speed = 80;
    int result = compare(c,c1);
    
    int s = [c compareSpeed:c1];
    
    NSLog(@"%i",s);
    return 0;
}


int compare(Car *c1,Car *c2)
{
    if (c1->speed > c2->speed) {
        return 1;
    }
    return 0;
}



17、匿名对象
Car *c = [Car new];  c->speed = 2500;  [c run];  //正常标准的写法,使用匿名对象的方式会有内存泄漏的危险不建议

@interface Car : NSObject
{
int speed;
}
- (void) run;
@end
@implenentation Car
- (void) run
{
NSLog(@"%i",speed);
}
@end

1)[Car new]->speed = 300; //[Car new] 就是匿名对象,没有把对象给出实际的名称
2)[[Car new] run];   使用匿名对象调用方法
第一句虽然给speed赋值为300,但是第二句执行结果输出为 0 。因为[Car new] 又会新建一个对象。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值