黑马程序员---OC基础2【对象储存】【函数和方法的区别】【方法和对象关系】【对象作为方法参数】【NSString类介绍】

------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);
时间: 2024-10-10 05:20:27

黑马程序员---OC基础2【对象储存】【函数和方法的区别】【方法和对象关系】【对象作为方法参数】【NSString类介绍】的相关文章

黑马程序员--oc基础第八篇

八. oc基础知识(Protocal) protocal 出发点:他仅仅是用来声明方法的. 1. 可以用来声明一大堆方法(但是不能声明成员变量) 2. 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 3. 只要父类遵守了某个协议,就相当于子类也遵守了 4. 协议列出了一组方法,有些是必须实现的,有些是选择实现(@optional).遵守协议就要实现协议里面所有必须实现的方法.         1. 定义一个协议 协议格式的编写 @protocol协议名称//为协议起一个有意义的名

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

黑马程序员--oc基础第五篇

五.oc的语法基础(内存管理上) 1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1. *给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身) *给对象发一条release消息,则计数器的值-1 *可以给对象发送retaincount消息来获取当前引用计数器的值 *当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super deall

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release

黑马程序员---OC基础9【Foundation框架】【NSString介绍】【NSURL读写字符串】【NSString字符串比较】【NSString前后缀检查及搜索】【NSRange使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [Foundation框架] 1.Foundation框架介绍 1)Foundation框架概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合 以便使研发程序变得 更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架 2)Foundation框架的作用 Foundation框架是Mac\iOS中其他框架的基础 Foundat

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [点语法] 1 1.使用“点语法” 2 Student *stu= [[Student alloc]init]; 3         //调用set方法 4         [stu setAge:20]; 5         [stu setName:@"Jone"]; 6         //点语法:xcode的特性,Xcode帮我们做了代码替换 7         //点语法,

黑马程序员---OC基础8【block类型】【Protocol】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [block类型] 1.block概念 block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量 方法的回调 block是一个类型,定义变量,用来存储代码块 2.block基本用法 block与函数很相似,有返回值类型,参数类型,主体: 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { }; 没有参数可以写void,比如:i