ios开发中类方法与self的注意点 与实例方法区别

Objective-C里面既有实例方法也类方法。类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method)。工厂方法的称谓明显和一般意义上的工厂方法不同,从本质上来说,类方法可以独立于对象而执行,所以在其他的语言里面类方法有的时候被称为静态方法。

注意点一:类方法

1,类方法可以调用类方法。

2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。

3,类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。

4,类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。

注意点二:self的规则

大家需要记住下面的规则:

1,实例方法里面的self,是对象的首地址。

2,类方法里面的self,是Class.

尽管在同一个类里面的使用self,但是self却有着不同的解读。在类方法里面的self,可以翻译成class self;在实例方法里面的self,应该被翻译成为object self。在类方法里面的self和实例方法里面的self有着本质上的不同,尽管他们的名字都叫self。

类方法创造的对象要不要用release释放?

答 不需要 这个对象被放到自动释放池中

Object-C中的私有方法和私有成员变量

成员变量默认对内是共有的,对外是私有的。

@interface Controller : NSObject

{

@private:    NSString *something;

}

+ (void)thisIsAStaticMethod;

- (void)thisIsAnInstanceMethod;

@end

@interface Controller (Private)

- (void)thisIsAPrivateMethod;

@end

下面的代码就是怎样获取私有变量(记得加头文件#import <objc/runtime.h>):

   NSString *str;

Mobj *obj = [[Mobj alloc] init];

object_getInstanceVariable(obj, "mt_", (void *)&str);

NSLog(@"%@",str);

[obj release];

//===================================

IOS实例方法和类方法的区别

类方法和实例方法

1:实例方法是— 类开头是+ 实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类。

在实例方法里,根据继承原理发送消息给self和super其实都是发送给self

在类方法里面self是其他的类的类方法,在类方法中给self发送消息只能发类方法self是类super也是

什么时候用类方法,要创建一个实例时候获取一个共享实例,或者获取关于类的一些共有信息

2:

类方法(class method)和实例方法(instance method)。类方法被限定在类范围内,不能被类的实例调用(即脱离实例运行)。alloc就是一种类方法。实例方法限定在对象实例的范围内(即实例化之前不能运行)。init就是一种实例方法,被alloc方法返回的对象实例调用。

NSObject *
object1 = [[
NSObject alloc]
init];

instance method  以减号 "-"
开头

class method  以加号 “+” 开头,相当于static方法

3:see see 更健康

Objective-C

1.OC是一门基于C的面向对象语言,是C语言的一个超集,同时具有C语言的特征

2.OC对类的定义和实现以及初始化

//声明类接口,继承NSObject对象(该对象是OC中所有类的顶级父类,所有类都继承于它)

@interface ClassName :NSObject

//成员属性和成员函数的声明

+(void)function;//类方法,不需要实例化对象就可以调用的方法

- (void)function2 :(NSString *)arg;//成员方法,必须通过实例化的对象调用

@end

//实现类

@imlementation ClassName

//成员属性初始化和方法的定义

@end

对象的初始化:ClassName *obj = [[ClassName alloc] init]

OC中以消息机制传递信息,发送alloc消息给类分配内存空间,发送init消息生成对象,指针指向对象本身。

3.类方法的调用

[obj function];

NSString *str = [NSString stringWithString:@"hello"];

[obj function2 : str];

4.输出函数

根据不同的输出格式输出不同的值 (%d :整形 ,%@:对象<发送description消息>,%s:字符串)

NSlog(@“The result is %d”,intNum);

CF代表Core Foundation (Cocoa)

CFShow发送description给它显示的对象,CFShow打印的信息不会显示时间戳,NSLog会显示,同时CFShow不需要格式字符                 串,它只能用于对象

CFShow(obj);

5.属性

支持点表示法:myTableViewCell.textLabel.text = @"hello" 等价于 [[myTableViewCell textLabel] setText:@"hello"];

使用属性生成器 property

在h文件中声明: @property int year

在m文件中合成生成器:@synthesize year

使用 obj.year = 1999 相当于调用了 [obj setYear:1999];

可以自定义取值方法和赋值方法(getter and setter)

-(int)year

{

return year;

}

- (void) setYear : (int) newYear

{

//此处添加了一些基本的内存管理方法,保留新的值,释放以前的值

if(newYear != year)

{

[year release];

year = [newYear retain];

}

}

也可以绕过oc的命名约定,自己指定getter和setter方法的名称;

@property(getter = isExist,setter = setExist:) BOOL exist;

@synthesize exist;

使用过程中既可以使用新定义的方法名,也可以使用以前的方法(点表示法)

属性的特性:readwrite readonly assign retain copy nonatomic

assign:默认行为,使用@property int year就使用了assign行为,就是给实例变量赋了一个值

retain:实现了两个功能,一个是保留了赋值时传递的对象,其次是赋值前释放了以前值,使用retain可以实现上面讨论的内存管理的优点,使用时加上 @property (retain)int year;

copy:发送一条复制的消息给被传递的对象,保留它,并释放任何以前的值;

nonactomic:非原子访问器,加上后可以提升访问速度,但当两个线程同时修改同一个属性时就会出现问题,原子属性可以保证属性在被一个线程使用时不被另一个线程访问,不存在atomic关键字,默认情况下,所有方法都是自动合成的。(类似与java中的线程锁机制synchronized)

readwrite:可读写

readonly:只读

时间: 2025-01-15 13:30:02

ios开发中类方法与self的注意点 与实例方法区别的相关文章

【IOS】IOS开发问题解决方法索引(一)

IOS开发问题解决方法索引(一) 1       Xcode工程调试时无法命中断点的问题 若没有勾选LLVM Compiler 1.6 –> CodeGeneration –> Generate Debug Symbols 一项,则程序调试时无法命中断点. 2       Xcode调试时查看变量的几种方法 Xcode如何查看内存中的数据 http://blog.csdn.net/evgd2288/article/details/8995779 Xcode的Debug中查看数据细节的方法 ht

【IOS】IOS开发问题解决方法索引(二)

IOS开发问题解决方法索引(二) 1       不使用ARC编译,-fno-objc-arc ios5 选择了ARC但是不使用ARC编译,-fno-objc-arc http://leobluewing.iteye.com/blog/1384797 http://blog.cnrainbird.com/index.php/2012/03/13/object-c_kai_fa_zhong_hun_he_shi_yong_huo_bu_shi_yong_arc/ 2       SIGABRT错误

【IOS】IOS开发问题解决方法索引(三)

1       判断js对象是否拥有某属性 http://www.cnblogs.com/snandy/archive/2011/03/04/1970162.html 两种方式,但稍有区别 1,in运算符 1 2 3 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' in obj); // --> true 可看到无论是name,还是原形链上的toString,都能检测到返回true. 2,h

【IOS】IOS开发问题解决方法索引(五)

1      Block教程系列 发布者:Seven's - 2013/04/22 - 分类:梦印象 ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发. 讨论范围:block的使用,内存管理,内部实现. 不包含的内容:gc arc下的block内存,block在c++中的使用. Block介绍(一)基础 Block介绍(二)内存管理与其他特性 block介绍(三)揭开神秘面纱(上) block介绍(四)揭开神秘面纱(下) 2      iOS开发 git gi

【IOS】IOS开发问题解决方法索引(六)

1       [Network]使用AFNetworking2.0请求数据时出现错误Requestfailed:unacceptablecontent-type:text/html解决方法 使用AFNetworking 2.0 请求数据时出现错误 Request failed: unacceptablecontent-type: text/html 解决方法 添加一行 manager.responseSerializer.acceptableContentTypes= [NSSet setWi

【IOS】IOS开发问题解决方法索引(四)

1       IOSNSTimer线程无法在委托方法之外停止 NSTimer无法在线程的委托方法之外停止. 2       在IOS4.3中添加AdSupport.framework会引起dyld 'dyld_fatal_error 将库引用参数设置为可选即可解决. 3       Failed to get the task for process xxx 证书问题,project与target的调试证书都必须是开发者证书,ADHOC的证书会出现此问题. 4       IOS NSInvo

iOS开发&gt;学无止境 - 方法缓存

摘要 只 要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到 的,方法缓存又是怎么运作的却鲜为人知.本文主要从源码角度探究了Objective-C在runtime层的方法决议(Method resolving)过程和方法缓存(Method cache)的实现. 简介 本文作者来自美团酒店旅游事业群iOS研发组.我们致力于创造价值.提升效率.追求卓越.欢迎大家加入我们(简历请发送到邮箱 [email pr

iOS开发init方法解析

自定义的init方法,都必须调用父类的init方法. 一般情况下为: - (id)init { [super init]; xxx = xxx; } 通常情况下,这种模式可以满足绝大多数的需求,但是在少量情况下,需要一些特殊处理. 1,出于优化的考虑,init方法会释放已经分配了内存的对象,然后创建另一个新对象并返回之. 2,init方法在执行过程中发生了错误,所以会释放对象并返回nil. 对于1,苹果官网的做法是将父类init方法的返回值给self,对于2,苹果官网的做法是检测父类返回的对象是

iOS开发 .framework的Optional(弱引用)和Required(强引用)区别, 有错误 Library not found………………

http://www.cnblogs.com/wanyakun/p/3494323.html 强引用(Required)的framework是一定会被加载到内存的,但是弱引用(Optional)的framework只在需要时才会被载入内存,这对于比较大的framework来说,在最初加载的时候会省很多时间. 简单解释一下,有一些库如Social.framework 和 AdSupport.framework,是在iOS6之后才被引入的,还有一些更新了新特性的只能在iOS6+上可用.当你添加一个f