@interface
和@implementation
TODO:分类(category)和扩展(extension)html
@property
、@synthesize
和@dynamic
segmentfault
objc推荐咱们经过set/get方法访问对象的属性。很显然,为每个属性手动添加set/get方法的声明和实现是个性价比很低的重复劳动。所以,objc提供了一些关键字帮助咱们简化这一过程。这几个关键字实际上就是这么回事儿。bash
单独作了总结:Objective-C的@property、@synthesize和@dynamic架构
@class
告诉编译器有这么个类在,属性、方法什么的暂时不用管。
主要的好处有两点:app
减小重复编译耗时框架
解决循环引用ide
在相关讨论中能够看到一些建议:布局
但就我我的见到的代码而言,@class并非普遍使用的特性。比起大量使用@class,我更倾向于只在有必要时才使用它。post
@public:实例变量可以使用符号 person->age = 32"
被直接读取。
@package:实例变量是公开的,除非它被指定在框架外(仅适用 64 位架构)
@protected:实例变量仅可由其类和其衍生类访问
@private:实例变量仅可由其类访问性能
极少显式地使用,用起来是这个样子:
@interface Person : NSObject {
@public
NSString name;
int age;
@private
int salary;
}
复制代码
默认地,@interface里定义的实例变量是@protected的,子类可访问。
须要私有变量时比较常见的方式是经过类扩展定义:
@interface HelloViewController ()
{
int _value;
}
复制代码
也能够在@implentation部分定义:
@implementation HelloViewController
{
int _value;
}
复制代码
@protocol
协议,也就是在OO中谈论的接口。
在协议中咱们可使用@required 和 @optional来指定方法是否必须实现,默认是required。
@protocol CustomControlDelegate
- (void)control:(CustomControl *)control didSucceedWithResult:(id)result;
@optional
- (void)control:(CustomControl *)control didFailWithError:(NSError *)error;
@end
复制代码
@optionnal这个特性使得代码更加灵活,挺多别的语言并不支持相似的能力,算是OC的一个优势了。
try/catch/finally
,不赘述。
@try{
// 试图执行下列语句
[self getValue:&value error:&error];
// 若是有异常或者被显式抛出...
if (error) {
@throw exception;
}
} @catch(NSException *e) {
// …在这里处理异常
} @finally {
// 老是在@try或@catch block的尾部执行这个
[self cleanup];
}
复制代码
有个很大的项目为了减小安装包大小,曾经把oc exception的能力给关掉了。 = =,不要学他们。
@“aaa”
@100
@YES
@[@"a",@"b",@"c"]
@{
@"key":@"value"
}
复制代码
@encode():返回一个类型的类型编码。这个类型值能够用于 NSCoder -encodeValueOfObjCType:at 中的第一个参数编码。
char *enc1 = @encode(int); // enc1 = "i"
char *enc2 = @encode(id); // enc2 = "@"
char *enc3 = @encode(@selector(aMethod)); // enc3 = ":"
复制代码
@defs():返回一个 Objective-C 类的布局。已废弃。
@autoreleasepool
@synchronized()
性能比较差可是用起来最方便的锁。
@compatibility_alias能够给类设置一个别名。
如
@compatibility_alias UICollectionViewController PSTCollectionViewController;
复制代码
typedef NS_ENUM(NSUInteger, TTGState) {
TTGStateOK = 0,
TTGStateError,
TTGStateUnknow
};
复制代码
参考
Enum in OC
总结:前三个数值上是相等的,在objc中用nil比较广泛
常见的就是bool和BOOL。
bool是c语言的,单独的一个类型(_Bool),在数值上true = 1,false = 0
bool类型只有true和false两种状态。
另外,条件判断语句在判断时,是以0为false,非0为true进行判断的。
由此有如下结论:
2 == true //假
(bool)2 == true //真
2 //真
复制代码
BOOL是ObjC定义的真假值类型,它在64位机器上等价于bool,在32位机器上是signed char
其定义以下,参考objc4-750
/// Type to represent a boolean value.
#if defined(__OBJC_BOOL_IS_BOOL)
// Honor __OBJC_BOOL_IS_BOOL when available.
# if __OBJC_BOOL_IS_BOOL
# define OBJC_BOOL_IS_BOOL 1
# else
# define OBJC_BOOL_IS_BOOL 0
# endif
#else
// __OBJC_BOOL_IS_BOOL not set.
# if TARGET_OS_OSX || TARGET_OS_IOSMAC || (TARGET_OS_IOS && !__LP64__ && !__ARM_ARCH_7K)
# define OBJC_BOOL_IS_BOOL 0
# else
# define OBJC_BOOL_IS_BOOL 1
# endif
#endif
#if OBJC_BOOL_IS_BOOL
typedef bool BOOL;
#else
# define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
复制代码
YES和NO
bool的表现已经讲过,这里关注一下BOOL做为signed char的表现。
这时,一个BOOL类型的变量值范围是-128~127,所以强制类型转换时可能会有异常:
BOOL boolVar = 256;
boolVar //假
boolVar == 0 //真
复制代码
另外强制类型转换时也不会把值转为0和1:
(BOOL)2 == true //假
复制代码
综上,使用时需注意:
if(var == YES)
应当直接写成if(var)
。参考:
单独开一篇,见iOS知识梳理 - category和extension
TODO:后面总结梳理。