类方法以及 self 注意点

OC 里面既有对象(实例)方法也有类方法. 从本质上来说, 类方法可以独立于对象而执行, 所以在其他的语言里面类方法有的时候被称为静态方法

注意点一: 类方法

  1. 类方法可以调用类方法
  2. 类方法不可以调用对象(实例)方法, 但是类方法可以通过创建对象来访问对象(实例)方法
  3. 类方法不可以使用实例变量. 类方法可以使用 self, 因为 self 不是实例变量
  4. 类方法作为消息, 可以被发送到类或者对象里面去(实际上, 就是可以通过类或者对象调用类方法的意思)

注意点二: self的规则

  1. 对象(实例)方法里面的 self, 是对象的首地址
  2. 类方法里面的self, 是Class

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

类方法创造的对象不需要使用 release 释放, 因为这个对象被放到自动释放池中

OC 中的私有方法和私有成员变量:

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

1
2
3
4
5
6
7
8
9
10
11
@interface Controller : NSObject
{
@private: NSString *something;
}
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end

@interface Controller (Private)
- (void)thisIsAPrivateMethod;
@end

获取私有变量:

1
2
3
4
5
6
7
#import <objc/runtime.h>

NSString *str;
Mobj *obj = [[Mobj alloc] init];
object_getInstanceVariable(obj, "mt_", (void *)&str);
NSLog(@"%@",str);
[obj release];
0%