oc和java的语法区别比较大,所以进度有点慢:重点在于基础
?
一:调试基础 输出语句oc基本与c相似,与java就有很大的不同(java直接是System.out.println("");)
字符串不是几本数据类型,所以需要使用NSLog(@"%@",name);输出,切记
?
OC中NSLog函数输出格式详解 %@ 对象 ? %d, %i 整数 ? %u 无符整形 ? %f 浮点/双字 ? %x, %X 二进制整数 ? %o 八进制整数 ? %zu size_t ? %p 指针 ? %e 浮点/双字 (科学计算) ? %g 浮点/双字 ? %s C 字符串 ? %.*s Pascal字符串 ? %c 字符 ? %C unichar ? %lld 64位长整数(long long) ? %llu 无符64位长整数 ? %Lf 64位双字
??
?
?
二:类和对象的创建(这里只是记录h,m,main三个文件之间的关联,内存的申请和释放以后会专门的研究)
oc与java不同,java类的实现和声明都是在一个文件中而oc类的声明在.h文件中,实现在.m文件中也就是说一个oc类需要有两个文件,这真它妈蛋疼啊,
?
java引入类import android.app.*;
?
oc引入类?#import "Student.h"?
?
?
Student.h文件声明类及属性,方法
?
// // Student.h // test_01 // // Created by wang on 15/11/1. // Copyright ? 2015年 wang. All rights reserved. // #ifndef Student_h #define Student_h @interface Student : NSObject{ int age; NSString* name; int address; } //h文件中定义参数时,必须要实现该参数的方法如age -(int)age,下面实现了age和name的方法,可以在main文件中使用对象来传递消息,address没有实现 则无法通过消息来传递 -(int)age; -(NSString*)name; -(int)address; - (void)setAge:(int)newAge;//定义方法 - (void)addName:(int)newName; - (void)setAddress:(int)address; -(void)setName:(NSString*)newName andAge:(int)newAge setAddress:(int)newAddress;//oc对象的创建的对象都是指针对象 @end #endif /* Student_h */
?注意:
?
?
? ?1. @interface --------> 等于java中的class
? ? ?2. 类名后的冒号:---------> 等于java中的extends
? ? ?3. 函数前面的减号- ?---------> 表示对象方法
? ? ?4函数前面的加号+ ?---------> 表示类方法,等于java的static方法
? ? ?5. 函数的返回类型和参数的类型必须用括号,形参用冒号:表示
?
NSString* name;类似于java的String name;
?
?
Student.m实现Student.h中定义的方法
?
// // Student.m // test_01 // // Created by wang on 15/11/1. // Copyright ? 2015年 wang. All rights reserved. // #import <Foundation/Foundation.h> #import "Student.h" @implementation Student // m 文件时实现其具体的方法等 // h 文件时定义方法和变量等 //-(void) 类似于java的private私有的 //+(void) 类似于java的static方法,类方法 //java对方法的使用叫调用,oc称为消息的传递 -(int)age{ return age;//获得age } -(int)address{ return address;//获得age } -(NSString*)name{ return name; } -(void)setAge:(int)newAge{ age=newAge; //将传入的newAge的值赋给age } //定义方法 -(void)setName:(NSString *)newName andAge:(int)newAge setAddress:(int)newAddress{ name=newName; age=newAge; address=newAddress; } @end
?
Student.m文件必须是 @implementation开头 @end结尾 ?这里要和java的定义接口和实现接口区别开
?
oc的程序入口和java类似都是mian函数
?
?
// // main.m // test_01 // // Created by wang on 15/11/1. // Copyright ? 2015年 wang. All rights reserved. // #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool {//自动回收池 Student* st=[[Student alloc]init]; [st setAge:(100)]; NSString* sname=@"百合不是茶"; [st setName:(sname) andAge:(99) setAddress:(23)]; NSLog(@"name=%@",st.name); NSLog(@"name:%@",[st name]); NSLog(@"%d",[st age]); NSLog(@"%d",st.address);//由于没有在h文件中实现其方法,无法通过编译 NSLog(@"%d",st.address); // NSLog(@"%@",st->name);//默认属性时protected所以无法打印 // insert code here... NSLog(@"Hello, World!");//字符串的打印 for (int n=0; n<10; n++) { // NSLog(@"第一次写oc的程序,有点小激动是吧。。。。。"); } BOOL b=2;//bool类型的打印 NSLog(@"BOOL--b-->%s",b?"YES":"NO");//打印字符串 NSLog(@"BOOL--b-->%@",b?@"YES":@"NO");//打印对象 NSLog(@"BOOL--b-->%d",b);//打印数字s //浮点单精度打印 float f=23.00; NSLog(@"float=%f",f); // 双精度 double d=32; NSLog(@"double=%g",d); //对象 NSString* s1=@"wang"; NSLog(@"s1=%@",s1); //定义char数组并输出 char* c[4]={"nihao","hello_java","hello_Android","hello_Object-c"}; for (int n=0; n<4; n++) { NSLog(@"%s",c[n]); } } return 0; }
?运行结果:
2015-11-01 19:01:22.951 test_01[1651:118415] name=百合不是茶 2015-11-01 19:01:22.952 test_01[1651:118415] name:百合不是茶 2015-11-01 19:01:22.952 test_01[1651:118415] 99 2015-11-01 19:01:22.952 test_01[1651:118415] 23 2015-11-01 19:01:22.952 test_01[1651:118415] 23 2015-11-01 19:01:22.952 test_01[1651:118415] Hello, World! 2015-11-01 19:01:22.952 test_01[1651:118415] BOOL--b-->YES 2015-11-01 19:01:22.952 test_01[1651:118415] BOOL--b-->YES 2015-11-01 19:01:22.952 test_01[1651:118415] BOOL--b-->2 2015-11-01 19:01:22.952 test_01[1651:118415] float=23.000000 2015-11-01 19:01:22.952 test_01[1651:118415] double=32 2015-11-01 19:01:22.952 test_01[1651:118415] s1=wang 2015-11-01 19:01:22.952 test_01[1651:118415] nihao 2015-11-01 19:01:22.952 test_01[1651:118415] hello_java 2015-11-01 19:01:22.953 test_01[1651:118415] hello_Android 2015-11-01 19:01:22.953 test_01[1651:118415] hello_Object-c Program ended with exit code: 0
?
?
oc对象的创建需要手动申请和释放,由于使用了自动回收池就没有手动释放 ?[st release]
?
Student* st=[[Student alloc]init];
? ?java创建对象 Student st =new Student();
?
? oc消息的传递
?? [st setAge:(100)]; /调用方法,传递参数
? java的调用
? ?st.setAge(100);
?
?
注意:如果在Student.m文件中未实现address和name的方法,mian文件中是无法打印出值的会出现运行时异常
-(int)address{
? ? returnaddress;//获得age
}
-(NSString*)name{
? ? return name;
?
}
?
异常:
Terminating app due to uncaught exception ‘NSInvalidArgumentException‘, reason: ‘-[Student name]: unrecognized selector sent to instance 0x1006001c0‘
?
*** First throw call stack:
?
?
?
?
?
原文:http://baihe747.iteye.com/blog/2253620