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:
相关推荐
Objective-C(简称OC)是一种面向对象的编程语言,它是苹果公司开发的Cocoa Touch和Mac OS X框架的基础。本文将全面总结OC的学习要点,包括类、对象、属性、setter、指定初始化、便利构造器等核心概念。 首先,我们...
- 使用`print()`在Swift中输出日志,而OC中通常是`NSLog()`。 以上就是OC与Swift混编的主要知识点,通过熟练掌握这些,开发者可以灵活地在新旧代码间穿梭,充分利用两者的优点,构建出高效、稳定的iOS应用。在实际...
在深入探讨OC基础知识之前,我们先理解OC的核心特性:消息传递、类与对象、继承、多态和动态性。 1. **消息传递** 在OC中,对象间的通信是通过发送消息实现的。比如,`[receiver performSelector:@selector(method...
1. **暴露OC方法给JS**: 使用`@objc`和`JSExport`协议来标记OC类和方法,使得它们可以被JavaScript调用。 ```objc @interface MyExportedClass : NSObject - (NSString *)greetWithName:(NSString *)name; @end...
在Objective-C或Swift代码中,我们可以使用`JSContext`类来创建一个JavaScript执行环境。`JSContext`提供了执行JavaScript代码、获取JavaScript对象以及将Objective-C对象暴露给JavaScript的方法。例如: ```objc #...
在Objective-C(OC)编程中,集合类型是非常重要的数据结构,它们用于存储和管理多个对象。本篇文档主要总结了OC中基础的集合类型,包括数组(NSArray和NSMutableArray)以及字典(NSDictionary)和集合(NSSet)。...
OC是面向对象的语言,其消息传递机制和C++有所不同,学习如何创建和使用类是必不可少的。 2. **Xcode IDE使用**:项目开发通常在Xcode环境中进行,了解Xcode的基本操作,如新建项目、设置目标设备、编译与运行、...
我们可以创建一个类别(Category)来扩展`NSString`,增加MD5加密的方法,使得对字符串进行MD5处理变得更加便捷。 以下是一个简单的OC MD5加密类别实现: ```objc #import #include @interface NSString (MD5) ...
方法类型分为实例方法(`-`)和类方法(`+`)。例如: ```objc @interface MyClass : NSObject - (void)myInstanceMethod; + (void)myClassMethod; @end ``` `NSInteger`和`NSUInteger`是Objective-C中用于整数...
在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。 引用计数器的作用是判断对象要不要回收的唯一依据。如果计数器不为0,则对象存在。Retain消息使计数器+1,Release消息使计数器-1,retainCount消息...
- 通过匿名对象创建和调用方法:`[[Car new] run];` #### 三、深入理解Objective-C类的结构 **1. 属性声明:** - 使用`@property`来声明类的属性,例如:`@property (assign) int speed;`。 - `assign`属性表示...
- **对比分析:** 构造不是面向对象编程的基本特性,构造主要指类的构造函数或初始化方法,用于创建类的实例。 #### 十二、所有类的根类 **知识点:** 根类 - **背景介绍:** 在Objective-C中,所有类最终都继承自`...
开发者可以通过定义类、创建对象、发送消息等方式来构建复杂的应用逻辑。此外,Objective-C还支持动态消息传递机制,这意味着可以在运行时确定对象接收的消息及其响应的行为,这为编写灵活而高效的iOS应用提供了可能...
- **控制台打印**:OC使用`NSLog`函数替代C语言中的`printf`来输出信息。 3. **常用数据类型**: - **整型**:`NSInteger` - **布尔类型**:`BOOL` - **结构体**:`NSRange` - **字符串**:`NSString` 4. **...
`NSLog`用于输出调试信息或日志信息,对于开发和调试过程非常有用。 - 示例: ```objc NSLog(@"This is a log message."); ``` #### 七、控制结构 Objective-C 中的控制结构与 C 语言相似,包括但不限于: - `if...
5. **设置输入和输出**: `NSTask`提供了`setStandardInput:`、`setStandardOutput:`和`setStandardError:`方法,可以分别设置标准输入、输出和错误流。你可以将这些流连接到文件、管道或者自定义的`NSPipe`对象,...
- 用于管理Objective-C对象的生命周期,适用于OC对象类型。 - **`copy`**: - set方法的实现是先释放旧值,然后复制新值。 - 适用于需要确保值的独立性和不可变性的场景,如 `NSString`、`NSBlock` 等类型。 - ...
对象创建时计数器初始化为 1;当计数器归零时,对象会被销毁。 2. **操作**: - **`retain`**:增加对象引用计数。 - **`release`**:减少对象引用计数。 - **`autorelease`**:延迟释放对象,直到自动释放池处理...