iOS 堆和栈类方法和实例方法的区别

黑马程序员-oc中类的定义及类方法和实例方法的区分用法
target="blank"&Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
oc中类的定义包含两部分:接口部分(interface)和实现部分(implementation)。
接口部分(放在头文件里)声明了类与父类的名字,实例变量及方法(方法可以初步理解为函数);实现部分(放在源文件里)完成对方法的实现。
& 接口部分:
&@interface &类名:父类名{
& 变量列表
& 方法列表
& 实现部分:
“类名.h”//注意:实现必须包含自己的分接口文件
@implementation{
&方法的实现&&//可以理解为(函数)它具体的函数体代码
类方法:通过类名直接访问的方法。 “+”方法;
实例方法:必须通过类实例化对象后才能访问,不能直接通过类名访问。“-”方法;
@interface
DrawClass:NSObject
&& NSString
-(void)Draw1;
+(void)Draw2;
@implementation DrawClass
-(void)Draw1{
NSLog(@"Draw1:画圆");
+(void)Draw2{
NSLog(@"Draw2:画三角形");
&调用方式:
[DrawClass
Draw2]; //类方法,通过类名直接访问
DrawClass *p=[[DrawClass
alloc] init];//实例化对象
Draw1];//实例化方法,通过实例化对象访问
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Objective-C入门教程02:定义一个类和实例化一个对象
我的图书馆
Objective-C入门教程02:定义一个类和实例化一个对象
Objective-C入门教程02:定义一个类和实例化一个对象
作为一个Javaer,你肯定已经了解了类、对象和方法的相关概念。如果你现在对类和对象还没一个深刻的认识,强烈建议先去了解一下OO的相关知识。Objective-C如何定义一个类比如我们把手机就可以看成一个类,手机具有颜色、品牌、操作系统等属性。同时也具有打电话、发短信等功能(行为)。在Java中,我们用代码可以表示为:package com.
* @author liuzc
public class Phone {
/******* Getter & Setter *******/
public String getColor() {
public void setColor(String color) {
this.color =
public String getOs() {
public void setOs(String os) {
public String getBrand() {
public void setBrand(String brand) {
this.brand =
public void makeCall(String number){
System.out.println("正在呼叫:"+number);
public void sendSMS(String number,String content){
System.out.println("发送短信给"+number+" 内容为:"+content); }
}下面我们先给出Objective-C中的代码,然后再来进一步说明。类声明(接口)//
OCStudy_01
Created by Liuzc on 12-12-5.
Copyright (c) 2013年 . All rights reserved.
#import &Foundation/Foundation.h&
@interface Phone : NSObject{
NSString *
NSString *
NSString *
-(NSString*)
-(NSString*)
-(NSString*)
-(void) setColor:(NSString*) _
-(void) setBrand:(NSString*) _
-(void) setOs:(NSString*) _
-(void) makeCall:(NSString*)
-(void) sendMsg:(NSString*) number AndContent:(NSString*)
@end类实现//
OCStudy_01
Created by Liuzc on 12-12-5.
Copyright (c) 2013年 . All rights reserved.
#import "Phone.h"
@implementation Phone
-(NSString*) color{
-(NSString*) brand{
-(NSString*) os{
-(void) setColor:(NSString*) _color{
-(void) setBrand:(NSString*) _brand{
-(void) setOs:(NSString*) _os{
-(void) makeCall:(NSString*) number
NSLog(@"正在呼叫: %@",number);
-(void) sendMsg:(NSString *)number AndContent:(NSString *)content{
NSLog(@"发送短信给 %@ ,内容为:%@",number,content);
@endPhone.h是头文件,Phone.m是Objective-C的类文件,在头文件中,我们需要编写@interface部分,在Phone.m文件中编写类的实现.当然,你把代码写在一个文件里也是可以的,但我们一般不推荐这样做。例如下面的代码也可以正常编译:Phone.m//
OCStudy_01
Created by Liuzc on 12-12-5.
Copyright (c) 2013年 . All rights reserved.
#import &Foundation/Foundation.h&
@interface Phone : NSObject
-(NSString*)
-(NSString*)
-(NSString*)
-(void) setColor:(NSString*) _
-(void) setBrand:(NSString*) _
-(void) setOs:(NSString*) _
-(void) makeCall:(NSString*)
-(void) sendMsg:(NSString*) number AndContent:(NSString*)
@implementation Phone
NSString *
NSString *
NSString *
-(NSString*) color{
-(NSString*) brand{
-(NSString*) os{
-(void) setColor:(NSString*) _color{
-(void) setBrand:(NSString*) _brand{
-(void) setOs:(NSString*) _os{
-(void) makeCall:(NSString*) number
NSLog(@"正在呼叫: %@",number);
-(void) sendMsg:(NSString *)number AndContent:(NSString *)content{
NSLog(@"发送短信给 %@ ,内容为:%@",number,content);
@end下面我们通过一张图来说明定义一个类的接口@interface部分的语法。 定义新类时,在Java中,当一个类的父类为Object时,我们不需要指明 ClassName extends Object。而在Objective-C中,需要显示的指明该类的父类,哪怕该类的父类为NSObject。其次还必须定义在处理该类的对象时将要用到的各种操作或是方法类型。同Java一样,类名通常以大写字母开头,尽管没有要求一定要这样做,但这种约定能使他人更容易读懂你的程序。还有一个容易忽视却又很重要的细节,在Objective-C中,所有的类名都必须是唯一的(Class Names Must Be Unique)。也许现在你已经明白为什么使用XCode新建项目时,为什么推荐你填写前缀了。For this reason, it’s advisable to prefix the names of any classes you define。在类的声明中,使用@interface定义类的接口部分。在Java中,interface是定义接口的关键字,可此interface非彼interface,实际上我们所理解的Java中的接口(interface),在Objective-C中称为。同样,我们通过一张图来说明类的实现@implementation部分的语法&@implementation部分包含声明在@interface部分的方法的实际代码。实现代码中必须导入它的接口文件,写在代码的第一行。NewClassName表示的名称与@interface中的名称相同,可以在类的名称之后使用冒号,@implementation NewClassName: ParentClassName,但这里与Java中一样,它是可选的,而且通常并不这样做。&Objective C中类分为两个文件,一个是.h文件,一个是.m文件.h文件存放函数的声明,类声明使用关键字@interface @end.m文件存放类的具体实现,类实现使用关键字@implementation @end&声明对象和对象初始化上面我们定义了一个类,并声明了几个属性和方法.那么我们如何使用我们定义的类呢?也就是说如何声明和初始化一个对象?在java中我们这样做.Phone phone = new Phone();
phone.setOs("iOS");
phone.setColor("white");
phone.setBrand("iPhone");
//调用打电话的方法
phone.makeCall("10086");
//调用发短信的方法
phone.sendSMS("10086","什么时候和Apple合作出iPhone移动3G版啊?");在java中实例化一个对象我们使用new关键字,在Objective-C中我们也可以使用new关键字实例化一个类,不过语法与java有点区别:Phone* phone =[Phone new];&有点C/C++基础的应该知道”*”代表的是指针变量,[Phone new]实例上是调用Phone的new方法,(你也许会诧异,我们在Phone中没有定义new方法啊,事实上new是NSObject中定义的方法,因为Phone继承了NSObject,所以也继承了new方法,想要了解Objective-C中更多关于继承的知识,可以查看).如果你查看网上一些Objective-C的开源代码,你会发现在实例化一个类时,大多使用的是下面的语法:Phone* phone = [[Phone alloc] init];甚至看到这样把两者拆开的写法:Phone* phone = [Phone alloc];[phone init]通过调用这两个方法,完成了对一个对象的声明和初始化,其中alloc是为对象申请了内存空间,init则完成了对象的初始化.在完成对象声明和初始化以后,就可以调用对象的方法:[phone setOs:@”iOS”];[phone makeCall:@”10086″];你也许就会问了,既然使用new和使用alloc init都可以,那我们通常应该使用哪一种,或者说这两种方式有什么区别呢?在回答这个问题之间,我们先来介绍Objective-C中的构造函数。Objective-C的构造函数在java中,当我们在实例化一个对象并对成员变量赋值时,我们通常使用构造函数,类似于:Phone phone = new Phone(“iOS”);当然构造函数需要我们自己重构.在Objective-C中,构造函数可以使用任何方式命名,但是通常,将他们命名为 init 。构造方法返回对象的一个指针,我们可以通过调用超类的 init 方法来获取这个指针,超类是当前的类所派生自的类,也就是当前类的父类,这里通常是 NSObject 类。-(Phone *) initWithOs:(NSString *)_os{
self = [super init];
[self setOs:_os];
-(Phone *)initWithOs:(NSString *)_os andWithColor:(NSString *)_color{
self = [super init];
[self setOs:_os];
[self setColor:_color]
}我们再来初始化Phone时,就可以使用下面的语句:Phone* phone =[[Phone alloc] initWithOs:@”iOS”];或者:Phone* phone =[[Phone alloc] initWithOs:@”iOS” andWithColor:@”black”];但是如果这里我们使用new的话,就无法做到这一点.所以你现在应该大致清楚了new和alloc+init的区别.new doesn’t support custom initializers (like initWithString)alloc-init is more explicit than new所以默认情况下,&new和alloc+init是没有什么区别的,new =&alloc+init毫不夸张的说,+new的实现应该是这样:+ (id) new
return [[self alloc] init];
}中关于new的介绍也说明了这点:This method is a combination of&&and&. Like&, it initializes the&isa&instance variable of the new object so it points to the class data structure. It then invokes the&&method to complete the initialization process.这一讲关于Objective-C中类的介绍就到这里,下一讲将介绍.
TA的推荐TA的最新馆藏[转]&
喜欢该文的人也喜欢实例方法需要实例一个对象,通过这个对象来调用相应的实例方法;类方法直接通过类名调用
类方法中可以直接调用类方法,不可以直接调用实例化方法,需要创建一个对象,通过对象调用相应地方法
实例化方法可以直接调用实例方法,也可以调用类方法
类方法不可以使用实例变量,可以使用self,因为self不是实例变量
在类方法中self相当于class,在实例化方法中self和super一样,标注对象首地址
类方法的对象不需要手动释放,会被放到自动释放池中
and so on............
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33393次
排名:千里之外
原创:47篇
转载:26篇
(2)(1)(6)(3)(1)(4)(6)(2)(9)(1)(2)(7)(2)(19)(6)(2)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'iOS类方法、实例方法、构造方法 - 简书
iOS类方法、实例方法、构造方法
类方法,也称静态方法或者工厂方法,以+开头,指的是用static关键字修饰的方法。类方法属于整个类,在项目中工具类的封装多用工厂方法调用,调用格式[类名 类方法];
举个例子,如果多个界面都需要从沙盒中取出某个数据,就可以把这个方法进行封装
新建一个类,继承于NSObject,类名为GetHead。
在GetHead.h中声明一个类方法+(NSString *)getHeadS//这里的getHeadString就是类方法名。(NSString *)就是这个类方法返回的值的类型。
在GetHead.m中实现声明的方法:
+(NSString *)getHeadString
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSString *strPath = [documentPathStr stringByAppendingPathComponent:@"/obj.txt"];
NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];
return newS
ViewController中调用这个方法:NSString *str = [GetHead getHeadString];
类方法也可以同样传参数进去,比如进行网络请求时候,可以把网络请求封装,传入不同的请求体即可。
实例方法指的是不用static关键字修饰的方法,以-开头,它属于类的某一个或某几个实例对象,即类对象必须实例化后才可以使用的方法,调用方式[对象名 对象方法];
例:有一个Person类,继承于NSObject,在.h文件中声明一个方法-(void).
在.m文件中实现这个方法-(void)say{NSLog(@"哈哈哈");}
ViewController要想调用这个方法:
Person *xm = [[Person alloc]init];
什么是构造方法:初始化对象的方法。一般情况下,在 OC 当中创建1个对象分为两部分(new 做的事):alloc:分配内存空间,init :初始化对象。
构造方法分为系统自带和自定义构造方法。
(1)如果是系统自带的构造方法,需要重写父类中自带的构造方法 比如init
(2)如果是自定义构造方法:属于对象方法那么以-号开头,返回值一般为id或者instancetype类型,方法名一般以init开头
系统构造方法书写格式:
- (instancetype)init
self = [super init];
if (self) {
自定义构造方法:
@property NSString *
//自定义构造方法 在初始化的时候为属性"年龄"和"姓名"赋值
- (instancetype)initWithAge:(int)age andName:(NSString *)
// 实现自定义构造函数 在初始化的时候为属性赋值
- (id)initWithAge:(int)age andName:(NSString *)name
if (self = [super init]) {
文章是为了留下记录,以便巩固基础知识,日后会继续完善,如果有不好的地方,敬请指教。}

我要回帖

更多关于 ios项目优化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信