1. 如果某个对象obj为nil,在执行obj的方法时
int i = [obj methodWhichReturnInt] 这时的 i=0 ,程序运行正常
如果执行函数返回值为结构体,如:CGPoint p = [obj getLocation] 则p为undifined
2.object 的自省机制
isKindOfClass:返回变量是否为指定类的对象(包含子类)。
isMemberOfClass:返回变量是否为指定类的对象(不包含子类)。
respondsToSelector: 返回变量是否包含指定的方法。
例子:
if ( [obj respondsToSelector:@selector(shootAt:) ] ){
[obj shootAt:target];
}
// @selector(方法名) 返回值的类型为 SEL SEL shootAtSelector = @selector(shootAt:);
3.通过performSelector: 或者 performSelector: withObject: 这两个方法让变量执行特定方法。
例子:
[obj performSelector:shootSelector];
[obj performSelector:shootAtSelector withObject:coordinate];
对于:NSArray,可以让数组内部的数据全部指定某个方法
[array makeObjectsPerformSelector:shootSelector];
[array makeObjectsPerformSelector:shootSelector withObject:target];
这种情况在UIButton中应用比较多
[button addTarget:self action:@selector(digitPressed:) …]
4.在NSLog的使用%@时,会默认调用[obj description]
NSLog(@“array contents are %@“,myArray); //%@会调用 [myArray description]
- (NSString *)description 是一个NSObject基本方法,必要时需要进行重写。
5.在循环 遍历NSArray时,一定要使用id类型,在遍历过程中再判断NSArray每个元素的类型进行强制转换。
for ( id obj in myArray ) {
if ( [obj isKindOfClass:[NSString class]] ) {
//这样可以确保obj的类型判断的正确性
}
}
6. NSNumber初始化
NSNumber *three = @3;
NSNumber *n = [NSNumber numberWithInt:36];
7. NSDictionary 以键值对的方式进行存储
初始化: NSDictionary *colors = @{ @“green” : [UIColor greenColor],
@“blue” : [UIColor blueColor],
@“red” : [UIColor redColor] };
UIColor *colorObject = colors[colorString];
//或者是
- (id)objectForKey:(id)key;
8. NSUserDefaults 再启动应用时用于存储一些用户的简单数据,实质上是一个NSDictionary,默认获取的方法为:
[[NSUserDefaults standardUserDefaults] setArray: rvArray forKey: @“RecentlyViewed” ];
再添加完成数据后需要执行:[[NSUserDefaults standardUserDefaults] synchronize];
9. NSRange 是一个c语言的结构体类型
typedef struct {
NSUInteger location;
NSUInteger length;
} NSRange;
//其中NSNotFound 就是一个location类型
//下面的程序为查找greeting字符串中是否包含 hi
NSString *greeting = @“hello world”;
NSString *hi = @“hi”;
NSRange r = [ greeting rangeOfString: hi ];
if ( r.location == NSNotFound ) {
NSLog(@“Not found");
}
10. UILabel 有一个属性 attributedText ,这时个NSAttributedString类型,并不是一个mutable类型,所以,
如果我们需要更改label文字的属性时,只能时西安复制,再重新赋值。
NSMutableAttributedString *labelText = [myLabel attributedText mutableCopy];
[labelText setAttributes: …];
myLabel.attributedText = labelText;