两天来坐地铁看的objective-c基础教程笔记

calvin 发布于 2014年03月05日
无人欣赏。

两天来坐地铁看的objective-c基础教程笔记,都是一些基础的东西,欢迎大家补充。

import

#import可以保证头文件只被包含一次

如何输入一个字符串

NSLog(@"Hello world %d %@")

%d输入数字, @%传进来的参数当成NSString

如何使用bool值

BOOL isSame()
{
    return (NO);//return (YES)
}

不能用常数跟yes去比较,如果用18 == YES(YES只等于1) 会返回 NO 应该去跟NO去比较 18 == NO 就真返回NO

id的含义

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

@implementation实现

#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元素

id元素是指向任意类型对象的指针

继承

@interface Circle: NSObject

import

倒入投文件有两种方法:使用引号或者尖括号。例如:#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

NSArray *array = [NSArray arrayWithObjects:@"one", @"two"];
NSArray *array2 = @[@"one", @"two"];

NSMutableArray

可变数组

枚举

获取枚举实例的方法:

 NSEnumerator *enumerator = [array objectEnumerator];

如果想从后往前浏览某个集合,还有一个reverseObjectEnumerator方法可以使用。

在选取下一个对象的时候可以调用下面方法:

- (id)nextObject;

nextObject返回nil值时,循环结束

快速枚举

for(NSString *string in array)
{
    NSLog(@"I found %@", string);
}

NSDictionary

+ (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

创建数字对象:

+ (NSNumber *) numberWithInt: (int) value;

NSValue

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])

Cocoa的内存管理规则

  1. 当你使用new/alloc或者copy方法创建一个对象时,该对象的保留计数器的值为1.当不在使用该对象时,你应该向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
  2. 当你通过其他方法获得一个对象时,假设该对象的保留计数器的值是1,而且已经被设置为自动释放,那么你不需要执行任何操作来确保该对象得到清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
  3. 如果你保留了某个对象,就需要释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
共2条回复
cnsoft 回复于 2014年03月06日

同好. 地铁的零碎时间 挺适合做头脑风暴的. 每次看书 我都有些偶得.

清醒疯子 回复于 2014年03月06日

感谢分享啊:)两天能做这么多笔记非常强大:)

我想问,在地铁上,怎么做笔记?:)

有些“stringFromXXXX“的方法,打印时用来转化数据类型很好用。

关于内存管理,我也分享一个笔记:

内存:堆放对象,栈放指针

assign:同栈,同堆,Count不变

retain:变栈,同堆,Count+1

copy:变栈,变堆,Count:1

登录 或者 注册