实例方法与类方法区别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实例⽅法与类⽅法区别
Objective-C⾥⾯既有也类。
类⽅法(Class Method) 有时被称为⼯⼚⽅法(Factory Method)或者⽅便⽅法(Convenience method)。
⼯⼚⽅法的称谓明显和⼀般意义上的⼯⼚⽅法不同,从本质上来说,类⽅法可以独⽴于对象⽽执⾏,所以在其他的语⾔⾥⾯类⽅法有的时候被称为静态⽅法。
点⼀:类⽅法
1,类⽅法可以调⽤类⽅法。
2,类⽅法不可以调⽤⽅法,但是类⽅法可以通过创建对象来访问实例⽅法。
3,类⽅法不可以使⽤实例变量。
类⽅法可以使⽤,因为不是实例变量。
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 ):
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 :整形,%@:对象,%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:发送⼀条复制的消息给被传递的对象,保留它,并释放任何以前的值;。