------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
【对象储存】
1、对象的储存细节
[Car new]
new做了3件事
1)向计算机申请存储空间
2)给类中的每一个成员初始化值
3)返回新申请的空间的首地址
(1)、申请的空间在内存的哪个区?
new 的时候申请的空间内存的堆区(程序动态分配的内存空间)
当new内存的布局:
初始化的时候:
如果实例变量是基本数据类型,此时给初始为0,
如果是字符串类型此时初始化为null
(2)、实例变量保存放在堆区
对象名,指针变量存放在栈区
(3)、对象方法保存在代码区
(4)、用[p run];可以调用方法
首先找p对应的堆区的空间,然后找到_isa指针,再找到_isa指向的代码区的空间,然后到该空间中找方法
(5)、一个类可以创建多个对象,不同对象在内存中储存的地址不同
【函数和方法的区别】
1、区别
对象方法
1)对象方法的实现只能写在类的实现中,对象声明只能写在类中
2)对象方法以-开头,类方法以+开头
3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
4)函数属于整个文件,可以在文件的任意位置写@interface@end中间,声明可以在main内部,也可以在main外部
5)对象方法归类\对象所有
函数
1)所有函数都是平行的
2)函数不存在隶属关系
3)函数中不能访问对象中的成员变量
2、常见错误
1、@interface和@implementation都不能嵌套
2、只有声明没有实现
3、漏写@end
4、两个类声明顺序可以打乱,但是要写,实现要写在声明之后
5、成员变量要写在{}里面
6、方法不能写在{}里面
7、在声明的时候不能对成员变量进行初始化
8、方法不能像函数一样调用
9、成员变量和方法不能用static等修饰,不要和C语言混淆
10、类的实现可以写在main之后,但是声明要在前
11、方法声明要实现,要不会警告
【方法和对象关系】
1 1、对象作为方法的参数 2 -(void)disPerson:(Person *)person{ 3 NSLog(@"姓名:%@ 性别:%d",person->_name,person->_sex); 4 } 5 6 Person *p = [Person new]; 7 8 Person *p1 = [Person new]; 9 p1->_name = @"张三丰"; 10 p1->_sex = 1; 11 Person *p2 = [Person new]; 12 p2->_name = @"sss"; 13 p2->_sex = 2; 14 15 [p disPerson:p2]; 16 17 2、对象作为方法的返回值 18 19 -(Person *)changeSex:(Person *)person{ 20 person->_sex = kSexYao; 21 return person; 22 23 } 24 25 Person *p = [Person new]; 26 27 Person *p1 = [Person new]; 28 p1->_name = @"张三丰"; 29 p1->_sex = 1; 30 Person *p2 = [Person new]; 31 p2->_name = @"sss"; 32 p2->_sex = 0; 33 Person *p3 = [p changeSex:p1]; 34 [p disPerson:p3];
【对象作为方法参数】
1 1、案例 2 士兵开枪,枪射击子弹 3 /* 4 枪类 5 名称:Gun 6 属性:型号_size 子弹个数 7 行为:射击 8 9 人类 10 名称:Soldier 11 属性:姓名_name 等级_level 12 行为:跑 蹲 开枪 跳 13 每射击一次子弹要减一; 14 15 子弹类 16 名称:Bullet 17 属性:子弹个数,型号 18 19 士兵在射击时,不但要有枪,还要有弹夹 20 */ 21 22 #import <Foundation/Foundation.h> 23 24 25 子弹类 26 @interface Bullet : NSObject 27 { 28 @public 29 NSString *_size; 30 int _bulletCount; 31 32 } 33 34 @end 35 36 @implementation Bullet 37 38 @end 39 40 41 42 枪类 43 @interface Gun : NSObject 44 { 45 @public 46 NSString *_size; 47 48 } 49 -(void)shoot:(Bullet *)bullet; 50 51 @end 52 53 @implementation Gun 54 55 -(void)shoot:(Bullet *)bullet{ 56 if (bullet->_bulletCount>0) { 57 bullet->_bulletCount--; 58 NSLog(@"%@正在射击突...,子弹剩余:%d",_size,bullet->_bulletCount); 59 60 }else{ 61 NSLog(@"没有子弹了!"); 62 } 63 } 64 65 @end 66 67 68 人类 69 @interface Soldier : NSObject 70 { 71 @public 72 NSString *_name; 73 int _life; 74 int _level; 75 // Gun *gun; 76 } 77 -(void)firing:(Gun *)gun and:(Bullet *)bullet; 78 @end 79 80 @implementation Soldier 81 82 -(void)firing:(Gun *)gun and:(Bullet *)bullet{ 83 //让枪装上弹夹射击 84 //子弹作为参数传递 85 [gun shoot:bullet]; 86 } 87 88 @end 89 90 91 92 int main(int argc, const char * argv[]) { 93 @autoreleasepool { 94 //创建士兵 95 Soldier *s = [Soldier new]; 96 s->_name = @"张三丰"; 97 s->_life = 99; 98 s->_level = 3; 99 //创建枪 100 Gun *g = [Gun new]; 101 g->_size = @"AK47"; 102 //创建子弹 103 Bullet *b = [Bullet new]; 104 b->_bulletCount = 3; 105 //调用士兵开枪方法 106 [s firing:g and:b]; 107 [s firing:g and:b]; 108 [s firing:g and:b]; 109 [s firing:g and:b]; 110 111 } 112 return 0; 113 }
【NSString类介绍】
1 1、NSString常见方法 是object中核心处理字符串的类之一(%@打印对象) 2 1)创建常量字符串,注意使用@符号 3 NSString *str = @"fdsfgsdgfs"; 4 5 2)创建空字符串,给于赋值 6 7 //第一种创建字符串方法 8 NSString *s = @"hhd"; 9 10 //第二种,是一个类,可以创建对象调用 11 NSString *s1 = [NSString new]; 12 s1 = @"dfsdfgsd"; 13 14 //第三种,格式化创建字符串 15 for (int i=0; i<10; i++) { 16 NSString *im = [NSString stringWithFormat:@"xxx%02d.jpg",i]; 17 NSLog(@"%@",im); 18 } 19 //第四种,用一个已经存在的字符串创建一个新字符串,复制拷贝创建 20 NSString *s2 = [[NSString alloc] initWithString:s1]; 21 NSLog(@"%@,%@,%@",s,s1,s2); 22 23 2、NNString字符串长度的计算 24 1)纯英文字符: 25 NSString *s3 = @"hhffd"; 26 //1)计算纯英文的字符串长度,typedef unsigned long NSUInteger;不包含\0 27 NSUInteger len = [s3 length]; 28 NSLog(@"%ld",len); 29 //2)字符串纯中文,在OC中,中英文都是一个字符,长度都是一个字符,在C语言中一个汉字占用三个字节 30 NSString *s4 = @"张三丰"; 31 len = [s4 length]; 32 NSLog(@"%ld",len); 33 //3)中英文混合,都占一个字节 34 NSString *s5 = @"张三丰dfsd12!@"; 35 len = [s5 length]; 36 NSLog(@"%ld",len);