黑马程序员_对象的简单分析_对象与函数参数_常见错误
一、面向对象封装的好处
1.更加接近人类的思考方式。
2.只需要关注对象,不需要关注步骤。
二、类的声明和实现
1. @interface 和 @implementation的分工
* @interface就好像暴露在外面的时钟表面。
* @implementation就好像隐藏在时钟内部的构造实现。
三、常见错误
1.只有类的声明,没有类的实现。
2.漏了@end
3. @interface 和 @implementation嵌套
4.两个类的声明嵌套
5.成员变量没有写在括号里面
6.方法的声明写在了大括号里面
四、语法细节
1.成员变量不能在{}中进行初始化,不能被直接拿出去访问
2.方法不能当作函数一样调用
3.成员变量、方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
4.类的实现可用写在main函数后面,主要在声明后面就行了。
五、OC方法和函数的区别
1.OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间;
也就是说OC方法不能独立于类存在。
2.C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有。
六、对象但简单分析
1.每个对象都占据一块存储空间。
2.类在内存中只占有一块存储空间。
3.创建类时在内存中创建一块存储空间。
4.在使用类创建对象之前,会将类加载进内存(只会加载一次)。
5.每个对象内部默认都有一个isa指针,这个指针指向对象所对应的类。
6.类中的方法列表是所有对象一起使用的。
7.成员变量每个对象都有一份,但是方法列表是公用的。
七、对象与参数
对象成员变量作为函数参数。
指向对象的指针作为函数参数
修改指向对象的成员
修改指针的指向
对象与函数参数代码示例:
#import <Foundation/Foundation.h>
@interface Car : NSObject
{ // 成员变量
@public
int wheels;
int speed;
}
- (void)run;
@end
@implementation Car
- (void)run
{
NSLog (@"%d个轮子,速度为%dkm/h的车子跑起来了。",
wheels, speed);
}
@end
void test(int w, int s)
{
w = 20;
s = 200;
}
void test1(Car *newC) // 传递Car类对象的地址
{
newC->wheels = 5;
}
void test2(Car *newC)
{
Car *c2 = [Car new];
c2->wheels = 5;
c2->speed = 300;
newC = c2;
newC->wheels = 6;
}
int main()
{
Car *c = [Car new];
c->wheels = 4;
c->speed = 250;
test(c->wheels, c->speed); // 值传递
// test1(c);
test2(c);
[c run];
return 0;
}
常见错误代码分析:
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
// 成员变量\实例变量
int wheels;
// int wheels = 4; 不允许直接初始化
// int wheels; 重复错误
// - (void)run; 方法的声明写在大括号{}外面
// static int wheels; 不能随便将成员变量当作C语言中的变量来使用
}
- (void)run;
/*
* 方法的实现必须写在@implementation里面
- (void)fly
{
}
*/
/*
* @interface 和 @implementation嵌套错误
@implementation Car
- (void) run
{
NSLog (@"%d个轮子的车子跑起来了。", wheels);
}
@end
*/
int main()
{
// wheels = 10; 实例变量不可直接赋值
Car *c = [Car new];
return 0;
}
// 类的实现可以放在main()函数的后面,但是声明必须放在前面。
// 就像函数一样,函数的声明放在main的前面,函数的定义可以放在前面也可以放在后面。
@implementation Car
// - (void)fly; 方法声明必须写在@interface里面
// - static (void)run 没有内部方法这个概念
- (void) run
{
NSLog (@"%d个轮子的车子跑起来了。", wheels);
}
@end
static void test()
{}