Demo
main.m文件
#import <Foundation/Foundation.h>
#import "Wangyuyan.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.OC类的对象只能在堆上分配
/* wangyuyan *wyy;//wangyuyan是类名, *wyy是对象
//2.alloc:在堆上创建一个对象
wyy = [wangyuyan alloc];//malloc
//3.init:初始化对象,对象没有被初始化时,不能使用
[wyy init];
上两句可并成一句wyy = [[wangyuyan alloc] init];
//4.new:创建并初始化
或wyy = [wangyuyan new];
*/
Wangyuyan *wyy = [Wangyuyan new];
wyy->name = @"王语嫣";
NSLog(@"%@",wyy->name);
[wyy eat];
[wyy dance:@"I don't know" count:10];
//类方法只能通过类名进行调用
// 例 [Wangyuyan test];//+
//实例方法只能通过一个具体的对象进行调用
// 例 [wyy eat];//-
NSLog(@"------1-----");
//隐含参数self,_cmd
//self表示调用这个方法的对象
Wangyuyan *wyy1 = [Wangyuyan new];
NSLog(@"1. %p",wyy1);//与[wyy1 run];等同
[wyy1 run];//堆,初始化为0
//实例方法是与对象同时存在
//实例变量存在于具体的对象中
//实例变量,成员变量
wyy1->_age = 19;
NSLog(@"4. %d",wyy1->_age);
NSLog(@"-----2------");
Wangyuyan *wyy2 = [Wangyuyan new];
NSLog(@"1. %p",wyy2);
[wyy2 run];
wyy2->_age = 20;
NSLog(@"4. %d",wyy2->_age);
NSLog(@"-----3------");
[Wangyuyan test];//+
}
return 0;
}
//1.OC类的对象只能在堆上分配
/*
wangyuyan *wyy;//wangyuyan是类名, *wyy是对象
//2.alloc:在堆上创建一个对象
wyy = [wangyuyan alloc];//malloc
//3.init:初始化对象,对象没有被初始化时,不能使用
[wyy init];
上两句可并成一句wyy = [[wangyuyan alloc] init];
//4.new:创建并初始化
或wyy = [wangyuyan new];
*/
Wangyuyan *wyy = [Wangyuyan new];
//类方法只能通过类名进行调用
// 例 [Wangyuyan test];//+
//实例方法只能通过一个具体的对象进行调用
// 例 [wyy eat];//-
Wangyuyan.h文件
#import <Foundation/Foundation.h>
@interface Wangyuyan : NSObject//NSObject父类,固定写法
{//描述对象的状态,实例变量
// int age1; //不能随便赋值
@public //任意地方访问
int _age;
NSString *name;
char dender;
@protected //当前类或派生类,默认是
float score;
@private //当前类
float money;
}
//方法,描述对象的能力(行为)
- (void)eat;
//方法名后面有参数必须带有":"号
- (void)dance:(NSString *)n count:(int)count;
- (void):(NSString *)n;//不好的习惯,没有方法名
- (void)run;
+ (void)test;
@end
Wangyuyan.m文件
#import "Wangyuyan.h"
@implementation Wangyuyan
{//作用域仅限于当前的实现
float mm;//@implementation wangyuyan中只能在最前面定义变量
}
- (void)eat{
//NSLog(@"Wangyuyan eat");
NSLog(@"%s",__PRETTY_FUNCTION__);
}
- (void)dance:(NSString *)n count:(int)count {
NSLog(@"%s %@: %d",__func__, n, count);
}
//隐含参数self,_cmd
//self表示调用这个方法的对象
- (void)run {
NSLog(@"2. %p",self);
//实例变量,隐含了一个self
//实例变量可以在该类多所有实例方法中使用
//实例变量不能直接在类方法中使用
NSLog(@"3. self->_age:_age%d: %d",self->_age,_age);//self->_age和_age是指的一样的东西。堆,初始化为0
}
+(void)test{
Wangyuyan *w = [Wangyuyan new];
//w->_age = 22;
NSLog(@"%d",w->_age);//堆,初始化为0
}
@end
输出:
2015-08-03 21:32:28.888 wangyuyan[1587:64727] 王语嫣
2015-08-03 21:32:28.889 wangyuyan[1587:64727] -[Wangyuyan eat]
2015-08-03 21:32:28.890 wangyuyan[1587:64727] -[Wangyuyan dance:count:] I don’t know: 10
2015-08-03 21:32:28.890 wangyuyan[1587:64727] ——1—–
2015-08-03 21:32:28.890 wangyuyan[1587:64727] 1. 0x100604f60
2015-08-03 21:32:28.891 wangyuyan[1587:64727] 2. 0x100604f60
2015-08-03 21:32:28.891 wangyuyan[1587:64727] 3. self->_age:_age0: 0
2015-08-03 21:32:28.892 wangyuyan[1587:64727] 4. 19
2015-08-03 21:32:28.892 wangyuyan[1587:64727] —–2——
2015-08-03 21:32:28.892 wangyuyan[1587:64727] 1. 0x100605090
2015-08-03 21:32:28.892 wangyuyan[1587:64727] 2. 0x100605090
2015-08-03 21:32:28.892 wangyuyan[1587:64727] 3. self->_age:_age0: 0
2015-08-03 21:32:28.892 wangyuyan[1587:64727] 4. 20
2015-08-03 21:32:28.892 wangyuyan[1587:64727] —–3——
2015-08-03 21:32:28.894 wangyuyan[1587:64727] 0
要点:
1.类方法和实例方法的调用
Wangyuyan *wyy = [Wangyuyan new];
//类方法只能通过类名进行调用
[Wangyuyan test];//+
//实例方法只能通过一个具体的对象进行调用
[wyy eat];//-
2.隐含参数self,_cmd
self表示调用这个方法的对象
3.实例方法和实例变量
实例方法是与对象同时存在
实例变量存在于具体的对象中
实例变量,隐含了一个self
实例变量可以在该类多所有实例方法中使用
实例变量不能直接在类方法中使用
4.访问控制权限
1).默认是@protected
2).@public 公开的,在任何位置都能访问
3).@protected 在类本身以及它的子类可以访问,但是类外面不能访问
4).@private 只能在当前类(定义该变量的类)中使用
5.关于命名:驼峰命名法
1).类名,首字母大写
2).变量名,首字母小写
3).方法名,首字母小写
4).实例变量名,用下划线开头(_)
5).考虑在类名前加上前缀(公司/项目名的首字母缩写)
6).尽量用完整的单词起名
6.局部变量,全局变量,静态变量的默认初始化值
1).局部变量:没有默认初始化
2).全局变量以及静态变量(static):系统自动初始化为零值
7.内存空间的分配
1).局部变量在栈上分配
2).类的对象只能在堆上分配
PS:所有名字在大括号中定义的空间都是栈空间(static修饰的除外)
8.子类会继承(具备)父类所有的功能
另:变量是一片内存区域的名字