两天来坐地铁看的objective-c基础教程笔记,都是一些基础的东西,欢迎大家补充。
#import可以保证头文件只被包含一次
NSLog(@"Hello world %d %@")
%d输入数字, @%传进来的参数当成NSString
BOOL isSame()
{
return (NO);//return (YES)
}
不能用常数跟yes去比较,如果用18 == YES(YES只等于1) 会返回 NO 应该去跟NO去比较 18 == NO 就真返回NO
id是一种范型,可以用来引用任何类型的对象。
id shape = [Shape new];
消息是对象可以执行的操作,用于通知对象去做什么。在[Shape draw] 的代码中,通过想shape对象发送draw消息来通知对象绘制自身。对象接受到消息后,将查询相应的类,以便找到正确的代码来运行。
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *name;
NSString *password;
}
- (void) setPersonName:(NSString *)personName;
- (void) printPersonName;
@end
#import "Person.h"
@implementation Person
- (void) setPersonName:(NSString *)c
{
name = c;
}
- (void) printPersonName
{
NSLog(@"print user name : %@", name);
}
@end
- (void) buy: (NSString *)what in:(NSString *) where {
NSLog(@"buy : %@", what);
NSLog(@"buy in %@", where);
}
main:
[p buy: @"food" in: @"restaurant"];
id元素是指向任意类型对象的指针
@interface Circle: NSObject
倒入投文件有两种方法:使用引号或者尖括号。例如:#import<Cocoa/Cocoa.h>和#import "Tire.h"。带尖括号的语句用于倒入系统头文件,而带引号的语句则书评倒入的是项目本地的头文件。
#import <Foundation/Foundation.h>
#import "Person.h"
@class Car;
@interface Woman : Person
@end
为什么有这个功能?如果Woman里引用了Car, Car里引用了Woman,那么编译的时候就会出错,所以引出了@class的功能。它告诉编译器,好吧你先编译,最后我能保证找到这个名称的类。
Objective-c引入了关键字@class来告诉编译器:这是一个类,所以我只会通过指针来引用
它。类里是引用它,如果这个类是继承它,那么还是是import。
+ (id) stringWithFormat: (NSSting *) format, ...;
NSString *height;
height = [NSString stringWithFormat:@"Your height is %d feet, %d inches", 5, 11];
stringWithFormat定义最后的省略号...,它告诉编译器这个方法可以瘦瘦多个以逗号隔开的参数。
如果在方法前面加一个加号,就是吧这个方法定义为类方法。这个方法属于类对象,通常用于创建新的实例。减号是实例方法。
创建NSArray
NSArray *array = [NSArray arrayWithObjects:@"one", @"two"];
NSArray *array2 = @[@"one", @"two"];
可变数组
获取枚举实例的方法:
NSEnumerator *enumerator = [array objectEnumerator];
如果想从后往前浏览某个集合,还有一个reverseObjectEnumerator方法可以使用。
在选取下一个对象的时候可以调用下面方法:
- (id)nextObject;
nextObject返回nil值时,循环结束
for(NSString *string in array)
{
NSLog(@"I found %@", string);
}
+ (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;
Tire *t1 = [Tire new];
Tire *t2 = [Tire new];
NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:t1, @"t1", t2, @"t2", nil];
Tire *tire = [tires objectForKey:@"aaa"];
Tire *tire = tires[@"aaaa"]
创建可变数组
+(id)dictionaryWithCapacity: (NSUinteger) numItems;
设置变量
- (id) setObject:(id)anObject forKey:(id)aKey;
删除变量
- (void) removeObjectForKey: (id) aKey;
创建数字对象:
+ (NSNumber *) numberWithInt: (int) value;
NSNumber实际上是NSValue的子类,NSValue可以封装任意值。
+(NSValue *) valueWithBytes: (const void *)value objCType:(const char* type)
value传的是数值的地址。你可以提供一个描述这个数据类型的字符串,通常用来说明实体类型和大小。你不用自己写代码来生成这个字符串,@encode编译器指令可以接受数据类型的名称并以你生成合适的字符串,所以按照如下方式把NSRectfangru放到NSArray中
NSRect rect = NSMakeRect(1, 2, 3, 4);
NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[array addObject:value];
获取内容:
value = [array objectAtIndex: 0]; [value getValue: &rect];
Cocoa采用了一种叫引用计数
的计数。当使用alloc/new方法或者copy创建一个对象时,对象的保留计数值被设置为1。要增加对象的保留计数器的值,可以给对象发送一条retain信息。要减少的话,可以给对象发送一条release消息。
使用retain
-(void) setEngine: (Engine *)newEngine
{
[newEngine retain];//外面还有个引用,所以要引用计数加一
[engine release];//释放掉实例原来的engine对象
engine = newEngine;//设置成最新的
}
当给一个对象发送autorelease消息时,实际上就将该对象添加到了自动释放池中。当自动释放池被销毁时,会向该池中的所有对象发送release消息。
return ([description autorelease])