OC语言学习笔记(2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OC语言学习笔记(2)一、OC方法
(一)对象方法
(1)对象方法以-开头如-(void)xx;
(2)对象方法只能有对象来调用
(3)对象方法中可以访问当前对象的成员变量
(4)调用格式[对象名对象方法名];
(5)设计一个学生类和狗类,练习对象方法的使用。
学生类的声明:
#import <Foundation/Foundation.h>
@interface Student : NSObject
//实例变量的声明
{
NSString *_name;//名字
int _age;//年龄
}
//类的行为--study方法
-(void)study;
@end
学生类的实现:
#import "Student.h"
@implementation Student
//方法的实现
-(void)study
{
NSLog(@"小明在学习...");
}
@end
狗类的声明:
#import <Foundation/Foundation.h> @interface Dog : NSObject
//实例变量
{
NSString *name;
}
//狗叫的方法
-(void)bark;
@end
狗类的实现:
#import "Dog.h"
@implementation Dog
-(void)bark
{
NSLog(@"狗在叫......");
}
@end
主程序:
#import <Foundation/Foundation.h> #import "Student.h"
#import "Dog.h"
int main(int argc, constchar * argv[]) { @autoreleasepool {
//学生对象s的创建
Student *s = [[Student alloc]init];
//指定学生为小明,年龄为18
s->_name = @"小明";
s->_age = 18;
//调用学生s的学习方法
[s study];
//------学生狗分界线------
//狗对象的创建
Dog *d = [[Dog alloc]init];
//狗名
d->_name = @"花花";
//调用d的dark方法
[d bark];
}
return0;
}
@end
(二)类方法
(1)类方法以+开头如+(void)put;
(2)类方法只能由类来调用
(3)类方法中不能访问实例(成员)变量,因为类方法又类来调用,并没有创建存储空间来存储类中的成员变量。
(4)调用格式:[类名类方法名];
(5)类方法的好处和适用场合:
不依赖于对象,执行效率更高;
能用类方法解决的问题,尽量使用类方法;
场合:当方法内部不需要使用到成员变量时,可以改为类方法。
(6)设计一个计算器类,练习使用类方法。
计算器类的声明:
#import <Foundation/Foundation.h>
@interface Calculator : NSObject
-(int)sumWithValue1:(int)v1 AndValue2:(int)v2;
@end
计算器类的实现:
#import "Calculator.h"
@implementation Calculator
-(int)sumWithValue1:(int)v1 AndValue2:(int)v2 {
return v1 + v2;
}
@end
主程序:直接使用类名调用类方法
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Dog.h"
int main(int argc, constchar * argv[]) {
@autoreleasepool {
Calculator *cal = [[Calculator alloc]init];
[cal sumWithValue1:1AndValue2:1];
}
return0;
}
@end
注意1:可以允许类方法和对象方法同名。
注意2:在对象方法中可以调用类方法。
(三)方法名
(1)不带参数的方法
声明:
-/+(void)study;
调用:
[对象名/类名study];
(2)带参数的方法
声明:
-(void)studentWithName:(NSString *)name AndAge:(int)age;
调用:
[对象名/类名studentWithName:@"小明宝宝" AndAge:18];
注意:冒号也是方法名的一部分。
二、文件编译
在工作中,通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h头文件中,实现写在相应的.m文件中去,类名是什么,文件名的前缀就是什么。
假设有两个类,分别是Person类和Dog类,则通常有下面五个文件:
(1)Person.h Person类的声明文件
(2)Person.m Person类的实现文件
(3)Dog.h Dog类的声明文件
(4)Dog.m Dog类的实现文件
(5)Main.m 主函数(程序入口)
在主函数以及类的实现文件中要使用#import包含相应的头文件。
补充:import有两个作用:
一是和include一样,完完全全的拷贝文件的内容;
二是可以自动防止文件内容的重复拷贝(即使文件被多次包含,也只拷贝一份)。
在使用命令行进行编译链接文件的时候,通常是把.m文件单文件编译,然后再把所有的目标文件链接,但是在Xcode中,是把所有的.m文件都进行编译链接的,如果出现重复定义的错误,那大部分问题根源应该就是文件内容被重复包含或者是包含.m文件所引起的。
源文件中不论是使用include还是import,都不能包含.m或者是.c文件,只能放声明。
因此,在OC中通常把类拆分开来,拆分成声明和实现两个部分。
提示:这也是编程思想的一种体现,可以说.h和.m文件时完全独立的,只是为了要求有较好的可读性,才要求两个文件的文件名一致,这也是把接口和实现分离,让调用者不必去关心具体的实现细节。
Xcode是写一行编译一行,有简单的修复功能,红色是错误提示,黄色警告。
如果在程序中声明了一个变量,但是这个变量没有被使用也会产生警告信息。
在调试程序的时候,如果发现整个页面都没有报错,但是一运行就错误,那么一定是链接报错。