OC视频笔记7(自定义初始化方法)8(类方法与实例方法的区别)(为什么NSString后面加*)

时间:2021-07-09 00:27:19

笔记7接笔记6

另一种创建对象的方法,作为了解,不推荐使用

OC视频笔记7(自定义初始化方法)8(类方法与实例方法的区别)(为什么NSString后面加*)

因为TestDemo *td = [[TestDemo alloc] init];可以看出该对象是分两步创建出来的,而且这样创建对象还可以直接向对象里面传入参数




下面说方法的调用:

6里面定义了shopping方法,shopping是实例方法(用实例对象去调用的方法),用"-"(减号)修饰。

调用shopping方法的语句:

[td shopping];  //如果传入参数的话[td shopping:200];    很简单,记住语法就可以了。


给属性设置值的方法就是设置器方法(set方法)。OC里面就是用set***这样的格式设置属性的。

-(void)setName:(NSString *)name;       //.h文件(类的声明文件)格式

-(void)setName:@"张三";                        //.m文件(类的实现文件)格式


获取属性的方法是获取器方法(方法名直接使用属性名)。OC里面就是用属性名的格式设置属性的。

-(NSString)name;                                     //.h文件(类的声明文件)格式

-(NSString*){

return _name;

}                                                                   //.m文件(类的实现文件)格式





视频8:类方法的定义

定义多个参数的方法:

声明类:

-(void)setName:(NSString*)name

            setAge:(NSInteger)age;

实现类:

-(void)setName:(NSString*)name

            setAge:(NSInteger)age{

       _name = name;

      _age = age;

}

类方法:

之前只接触了实例方法,就是以减号开头的方法,现在说一下以加好开头的方法:

加号开头的方法叫类方法,即直接用类名调用的方法,与java中的static方法比较相像。

声明类:

+(TestDemo*)newTestDemo;//方法描述:用于创建一个TestDemo对象,返回类型就是TestDemo类型

实现类:

+(TestDemo*)newTestDemo{

       TestDemo  *td = [[TestDemo alloc] init];

       return td;

}


疑问1:

OC中类方法和实例方法的区别:

我们都知道,在OC中,方法前有“+”的表示类方法,前面有“-”的代表实例方法

那么究竟什么是类方法,什么是实例方法呢?在什么情况下定义类方法,在什么情况下定义实例方法呢?

1.类方法类似于C++中的static函数。它的调用不需要通过实例,也不能调用类中的实例方法。其调用方法为:[类名 方法名]

2.实例方法则必须通过实例来调用,换句话说,一个类在没有初始化实例的情况下是不能调用实例方法的,它的调用方法为:[实例名 方法名]

3.那么,在什么情况下定义类方法,在什么情况下定义实例方法呢?举个例子进行说明

   比如,一个型号的车是一个类。那么,同一型号的车就是车这个类的不同对象,他们有着相同的初始属性(比如型号、发动机等)。

   如果我们把洗车看作是一个方法,那么,洗车是一个实例方法。为什么?因为洗车对应的是其中一辆车,而不是车这一个类。

   如果我们把统计一共生产了多少辆该型号的车看作一个方法的话。这个方法就是类方法,因为它针对的是车这一个类,而不是具体的哪一辆车。

综上,如果我们定义的方法中需要修改实例的属性的话,就要定义成实例方法,如果不需要用到具体实例中的属性,就定义成类方法。


疑问2:

其实在6里面就应该提出这个问题了,NSString *_name;为什么它有*而其他属性没有*?

网上关于OC语言为什么创建NSString对象加*的资料很难找

我只找到这样一段话:

<code class="hljs objectivec has-numbering">   <span class="hljs-comment">//创建空字符串,给予赋值 </span>
<span class="hljs-built_in">NSString</span> *astring = [[<span class="hljs-built_in">NSString</span> alloc] init];
astring = @<span class="hljs-string">"This is a String!"</span>;
<span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"astring:%@"</span>,astring);
[astring release];

<span class="hljs-comment">//在以上方法中,提升速度:initWithString方法 </span>
<span class="hljs-built_in">NSString</span> *astring = [[<span class="hljs-built_in">NSString</span> alloc] initWithString:@<span class="hljs-string">"This is a String!"</span>];
<span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"astring:%@"</span>,astring);
[astring release]; </code>

要知道NSString类型是不可变的字符串类型当对象创建后就不能对其进行改变了,而NSString * astring 只是对我们创建的字符串进行了引用,astring并不是我们创建的NSString对象只是对他的指引或者说是引用,而当执行astring = @”This is a String!”; 这条语句的时候相当于在内存中新开辟了一块内存空间用来存储OC字符串对象,而这时astring只是从指向原来的NSString字符串对象转变成指向新创建的字符串对象,而不是改变了原来的字符串给空字符串赋值!


那么就可以理解为不加星号的话,那么字符串就不可以改变了,加上星号,创建出来的就是指向字符串的指针,要是想要更改字符串的值的话,只需要让指向字符串的指针指向别的字符串就可以了,我先这么理解一下,以后再慢慢理解。