BNR:Objective-C Programming
2014-03-01 01:23
337 查看
Basics
BOOL在
objc/objc.h定义
if/else 最好写上花括号,别像Apple那样犯低级错误
goto fail
sleep()in
unistd.h中
EXIT_SUCCESS和
EXIT_FAILUR在
stdlib.h中
%zu打印 sizeof返回的
size_t
(实例变量以 开头只是为了与局部变量进行区分,没有特殊含义)【好像不是这样子的!】。如果只声明property, 编译器会默认添加 name的变量,可以显示的使用。
%@ 符号调用相应对象的的
description方法
用
@interface ClassName()...@end声明实例变量或属性,只有在类内部可见,对象不可见
子类不能访问父类的类扩展
__weak MyObject *obj声明弱引用
数组排序
NSSortDescriptor, 过滤
NSPredicate
NSNumber实例,@4, @5.6
用
NS_ENUM()声明枚举类弄
typedef NS_ENUM([char, int, unsinged long,…], enum_name){ … };
OC中有4种形式的回调:(Demo in Callbacks)
Target-action, 用
target:obj selector:@selector()。 为了加快运行速度,编译器为每一个方法分配唯一的数字,在运行时使用数字而不是方法名
Helper-action用delegate实现
Notifications
BLocks
__unused去除警告
block 会对它引用的对象保持强引用。
mybolck = { NSLog(@“%@“, self); 这种方法导致强引用 } __weak MyObject *weakSelf = self; myblock = { NSLog(@“%@“, weakSelf); }
不要直接引用实例变量,使用存取器
__weak MyObject weakSelf = self; myblock = { NSLog(@“%@“, iVar); //直接访问实例变量 } / 上面的代码编译器会编译为 / _weak MyObject weakSelf = self; myblock = ^{ NSLog(@“%@“, self->iVar); 还是会导致self的强引用 } / 应该这样写 / _weak MyObject weakSelf = self; myblock = { MyObject innerSelf = weakSelf; NSLog(@“%@“, innerself.iVar); }
block访问的外部变量默认为常量,不能修改它们的值。如果想在block中修改外部变量,要使用
__block来声明。
是否响应某个方法
respondsToSelector:
基于事件驱动,就是应用加载完后,开启循环坐等事件到来。
UITableView
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]
Advances
init。instancetype告诉编译器期望该方法所属的类的一个实例。任何你写的或是覆盖的初始化方法应该返回instancetype。在Xcode4.3之前,使用的是id, 但是instancetype是更好的选择。
- (instancetype)init { //self = [super init]; //if(self){ if(self = [super init]){[code=plain]_var1 = ...;
}// 养成好习惯:检查父类的初始化,用实例变量来赋值。
return self;
}
初始化方法的写法:
如果一个类有多个初始化方法,只有一个做真正的初始化工作,也就是指定的初始化方法。其他所有的初始化方法,直接或间接的调用该指定的初始化方法(每个类只有一个指定的初始化方法。如果一个类有其他的初始化方法,这些方法必须调用指定的初始化方法。)
指定的初始化方法在初始化它的实例变量前会调用父类指定的初始化方法
如果你的类的指定初始化方法与父类的指定的初始化方法名字不同,你必须重写父类的指定的初始化方法,并调用新的指定的初始化方法
如果有多个初始化方法,在头文件中要有明显的文档指明哪个是指定的初始化方法。
property attributes
readwrite默认
readonly
assign对非对象类型是默认的,只是把传过来的值赋给属性
strong对于对象指针是默认的
weak没有对所指对象的拥有权,如果这个对象被释放,属性会自动被置为nil,避免野指针。
unsafe_unretained跟 weak一样没有拥有权,但是当对象被释放时不会自动置为nil。
copy对传进的对象的副本有强引用。
- (id)copy {[code=plain]return [self copyWithZone:NULL];
}
- (id)mutableCopy
{
return [self mutableCopyWithZone:NULL];
}
copyWithZone:和
mutableCopyWithZone:定义在
NSCopying和
NSMutableCopying协议里,如果想自己的类有copy功能,要遵从这2个协议。
nonatomic总是使
readwrite的属性为nonatomic. 默认的为
atomic
key-value
key path
NSStrng *num = [sales valueForKeyPath:@“manager.contacts.phone”]; [sales setValue:@“5555-555” forKeyPath:@“manager.contacts.phone”];
KVO(key-value observing)用kvo context区分不同的通知,如子父与父类的。
显示地触发通知
willChangeValueForKey:和
didChangeValueForKey:
运行时查看class,methods的方法很好。
相关文章推荐
- Effective Java 06 Eliminate obsolete object references
- 一些常见的debug错误
- AttributeError: 'module' object has no attribute 'Frame' 解决方法
- error C2504: 'CObject' : base class undefined
- Matlab报错BLAS loading error: dlopen: cannot load any more object with static TLS 处理办法
- 【C#开发iOS】Objective-C与C# with Xamarin的开发代码对比
- objective -c OC语法学习小结
- Multiple markers at this line - The type java.lang.Object cannot be resolve
- object.constructor
- DisplayObject等显示对象基类
- objective c 学习(一)
- iOS开发:详解Objective-C runtime
- Object转Integer
- Effective C++ Item 17 Store newed objects in smart pointer in standalone statements
- Objective-c: 移除字符串中的指定字符
- 关联 objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects
- ios反射调用类的方法(objectiveC)
- Objective-C消息机制的原理
- Dictionary Object (Scripting Runtime Library)
- IOS,Object C学习过程中遇到的attributes