iOS自学日记-第一天

来源:互联网 发布:淘宝联盟伴侣 编辑:程序博客网 时间:2024/06/08 10:31

之前学的是c/c++,现在在上安卓的课,也算是接触了一点java,嗯,那我就来自学一下ios开发吧(什么逻辑。。。)

首先,objective-c也是一门面向对象的语言,跟c有相同的地方,跟java也有相同的地方,毕竟一个是完全不面向对象的,一个是完全面向对象?

于是买了《OBJECTIVE-C PROGRAMMING》这本书来看,就第一天看来,看到第19章,也有三分之一了,书写的还是很不错的,翻译得也很不错。

书前13章都是回顾c语言的一切语法,有c语言基础的人估计很快就能上手,由于一段时间没有写c/c++了,还是花一个小时回顾一下吧。

嗯,总算要进入oc的部分了,在xcode创建一个os x 的命令行程序,那就先来个HelloWorld吧,咦,怎么创建好就可以跑啦:


////  main.m//  helloWorld////  Created by xiaoye on 15/11/10.//  Copyright © 2015年 xiaoye. All rights reserved.//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSLog(@"Hello, World!");    }    return 0;}


oc创建的是.m 文件,就相当于c++的cpp文件或者java的.java文件,不过我记得matlab创建的命令文本也是.m文件?这两者之间有什么关系?不知道~~

首先不得不提一个基本oc程序的“标准框架”:

#import<Foundation/Foundation.h>:这个好像就是一个框架,以后我们封装了很多类就是通过这个框架装载在一起的,当然,本身系统很多类和方法都是通过这歌框架装载到一起的。

main函数当然就是程序的入口啦,main函数这个应该几乎是所有编程语言默认的程序入口了吧。

@autoreleasepool  按照它放的位置,它应该作用于它之后的所有对象和变量,它又在main函数这个位置,基本就是整个程序了。。。按照字面的意思,这个模块应该是自动释放某种东西的机制?百度了一下,看了几篇文章,大概是说@autoreleasepool能自动释放一些创建局部变量,对象什么的,看到有篇博客做了个测试,写一个for 循环,循环好像是500000次?每次创建两个实例,分别开@autoreleasepool和不加@autoreleasepool的区别,大概如下图(转载自土土哥的blog):


我总结了一下,这个跟oc的内存优化有关,有点类似ARC(Automatic Reference Counting),至于ARC,书是这样描述的:每次创建一个实例都是先创建一个指向这个实例的指针来“代表”它,当然,很多时候我们也会声明另外一个指针指向它,当一个实例还有指针指向它,那个说明这个实例还有用,当没有指针指向它时,说明已经不需要它了(你也找不到这个实例了。。),系统可以回收了,以前是需要程序员自己写这样的counter的,现在系统自带这个功能了。

NSLog大概就把它yy成c语言的printf吧,除了前面要加一个@(NSLog(@"....");),基本用法也差不多了吧。

然后就是%@和%s的区别,虽然都是代表字符串类型的格式,但是一个是NSSting的字符串,一个是string,算是普通的的字符串咯。

书学到现在,出现的都是NS开头的类,这是什么呢?其实就是NEXTSTEP的意思,是乔帮主第一次离开苹果时的公司的名字,oc提倡这些包里的类的名称都是用2~3个大写字母开头作为标示,仅仅是因为它经典。。所以用来做练习。

最后说一下这里的类?还是消息传递机制什么的。反正第一眼看到就懵了

////  main.m//  bmitime////  Created by xiaoye on 15/11/10.//  Copyright © 2015年 xiaoye. All rights reserved.//#import <Foundation/Foundation.h>#import "BNRPerson.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        BNRPerson *mikey = [[BNRPerson alloc] init];//相当于c++的 class BNRPerson mikey;         [mikey setWeightInKilos:20];//相当与c++的 mikey.setWeightInKilos(20);        [mikey setHeightInmeters:50];<span style="font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif;">//相当与c++的 mikey.setWeightInKilos(20);</span>        NSLog(@"mikey is %.2f meters tall and weighs %d kilograms",mikey.heightInMeters,[mikey weightInKilos]);    }    return 0;}
BNRPerson.h:

////  BNRPerson.h//  bmitime////  Created by xiaoye on 15/11/10.//  Copyright © 2015年 xiaoye. All rights reserved.//#import <Foundation/Foundation.h>@interface BNRPerson : NSObject{    float _heightInMeters;//类的成员变量一般用“_”开头    int _weightInKilos;}- (float)heightInMeters;//类的方法以“-”开头,“:”后面跟形参;- (void)setHeightInmeters:(float)h;- (int)weightInKilos;- (void)setWeightInKilos:(int)w;- (float)bodyMassIndex;@end

BNRPerson.m:

////  BNRPerson.m//  bmitime////  Created by xiaoye on 15/11/10.//  Copyright © 2015年 xiaoye. All rights reserved.//#import "BNRPerson.h"@implementation BNRPerson- (float)heightInMeters{    return _heightInMeters;}-(void)setHeightInmeters:(float)h{    _heightInMeters = h;}-(int)weightInKilos{    return _weightInKilos;}-(void)setWeightInKilos:(int)w{    _weightInKilos = w;}-(float)bodyMassIndex{    return _weightInKilos / (_heightInMeters * _heightInMeters);}@end
最后补充下:oc的self等于c++的this,只能这么说了。




1 0
原创粉丝点击