目录
OC语言基础
OC与C
OC完全兼容C, 所以可以在OC程序中编写C语言代码,并且可以将C语言的源文件和OC的源文件组合在一起生成可执行文件。
printf与NSLog的区别
- NSLog会自动换行
- NSLog在输出内容时会附加一些系统信息(含有对象的内存地址)
- NSLog和printf接收的参数不一样
printf("c hello world\n");
NSLog(@"OC hello World");
函数和方法的区别
- 函数属于整个文件, 方法属于某一个类
方法如果离开类就不行 - 函数可以直接调用, 方法必须用对象或者类来调用
注意: 虽然函数属于整个文件, 但是如果把函数写在类的声明中会不识别 - 不能把函数当做方法来调用, 也不能把方法当做函数来调用
方法的注意点
方法可以没有声明只有实现
方法可以只有声明没有实现, 编译不会报错, 但是运行会报错
如果方法只有声明没有实现, 那么运行时会报:
reason: '+[Person demo]: unrecognized selector sent to class 0x100001140’
发送了一个不能识别的消息, 在Person类中没有+开头的demo方法
reason: '-[Person test]: unrecognized selector sent to instance 0x100400000’
类也有一个注意点:
类可以只有实现没有声明
注意: 在开发中不建议这样写
初学常见报错情况
// 1.只有类的声明,没有类的实现
// 2.漏了@end
// 3. @interface和@implementation嵌套
// 4.成员变量没有写在括号里面
// 5.方法的声明写在了大括号里面
// 6.成员变量不能在{}中进行初始化、不能被直接拿出去访问
// 7.方法不能当做函数一样调用
// 8.OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
// 9.C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
// 10.C函数不能访问OC对象的成员
// 11.低级错误:方法有声明,但是实现的时候写成了函数
// 12.OC可以没有@interface同样可以定义一个类
#pragma mark的使用
#pragma mark - 类1
……
#pragma mark - 类2
……
#pragma mark - 类3
……
OC面向对象概念
1.什么是面向对象?
找对象使用对象的方法(功能)
2.对象
3.什么是类?
类就是用于描述对象的共性特征
主要用于描述对象的属性和行为
4.如何定义一个类
4.1类的声明
声明类的目的: 告诉系统我们这个类中有哪些属性和方法
类名: 首字母大写
: NSObject 为了让我们的类具备创建对象的能力, 也就是可以使用new方法
@interface 类名 : NSObject
{
属性; // 属性必须写到{}中, 属性名称以_开头
}
方法; // 方法必须写到{}外面
@end
4.2类的实现
@implementation 类名
方法的实现
@end
5.如何创建对象
要想创建对象必须给类发送一个new消息, 调用类的new方法
>开辟存储空间
>初始化属性
>返回地址
类名 *p = [类名 new];
5.1如何发送消息? [类名/对象 方法名称]
6.修改对象的属性和获取对象的属性
因为类的本质是一个结构体, 所以我们是用一个指向结构体的指针保存了对象的地址, 所以我们可以通过指针操作结构体的方式来操作对象
p->属性名称 = 值; // 对象的属性默认是受保护的, 必须把属性变为公开的才可以直接访问@public
NSLog(@"age = %i", p->age);
7.类中可以定义两种方法
7.1对象方法
以-开头
可以直接访问对象的属性
必须使用对象调用
对象方法中可以直接调用其它对象方法
对象方法中可以直接调用类方法
7.2类方法
以+开头
不可以直接访问对象的属性
必须使用类调用
类方法中不可以直接调用对象方法
类方法中可以直接调用类方法
7.3方法定义的注意点
方法名采用 驼峰命名
方法中的数据类型都必须使用()括起来
方法中每个参数的数据类型前面都必须加上:
:也是方法名的一部分
NString基本使用
int main(int argc, const char * argv[]) {
/*
// C语言中的字符串不是对象
char *name1 = "lnj";
char name2[] = "lmj";
// OC中的字符串是一个对象
// 正是因为OC中的字符串是一个对象, 所以它就具备了很多功能
NSString *str = @"lk";
Iphone *p = [Iphone new];
// 注意: 输出C语言的字符串使用%s
// 输出OC的字符串使用%@, %@就专门用于输出对象类型的
// NSLog(@"content = %s", [p loadMessage]);
NSLog(@"content = %@", [p loadMessage]);
*/
// 1.如何创建OC字符串
// NSString *str = @"lnj";
// printf("age = %i, height = %f\n", 30, 1.75);
// NSString *str = [NSString stringWithFormat:@"age = %i, height = %f\n", 30, 1.75];
// NSLog(@"str = %@", str);
// 2.如何计算字符串的长度
// char name[] = "lnj"; // l n j \0
char name[] = "李";
// 包含\0
size_t size = sizeof(name);
printf("size = %lu\n", size);
// 不包含\0
size_t length = strlen(name);
printf("length = %lu\n", length);
// 不包含\0的
// 计算出来的是个数, 而不是占用的字节数
// NSString *str = @"lnj";
NSString *str = @"李南江";
NSUInteger len = [str length];
NSLog(@"len = %lu", len);
return 0;
}
修改项目模板
/*
修改项目模板以及main函数中的内容
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Mac/Application/Command Line Tool.xctemplate/
修改OC文件头部的描述信息
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/Source/Cocoa Class.xctemplate
*/
/*
Xcode文档安装的位置1:
/Applications/Xcode.app/Contents/Developer/Documentation/DocSets
注意: 拷贝之前最好将默认的文档删除, 因为如果同时存在高版本和低版本的文档, 那么低版本的不会显示
Xcode文档安装的位置2:
/Users/你的用户名/Library/Developer/Shared/Documentation/DocSets
如果没有该文件夹可以自己创建一个
*/
匿名对象
// .h和.m之间切换快捷键 command + control + ⬆️
int main(int argc, const char * argv[]) {
// 匿名就是没有名字, 匿名对象就是没有名字的对象
// 1.有名字的对象
// 只要用一个指针保存了某个对象的地址, 我们就可以称这个指针为某个对象
// 称p为Person对象
Person *p =[Person new]; // 0ffc12
p->_age = 30;
p->_name= @"lnj";
[p say];
/*
0ffc12->_age = 30;
0ffc12->_name= @"lnj";
[0ffc12 say];
*/
// 2.没有名字的对象
// 无论有没有名字, 只要调用new方法都会返回对象的地址
// 每次new都会新开辟一块存储空间
[Person new