两天来坐地铁看的objective-c基础教程笔记
calvin两天来坐地铁看的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的内存管理规则
- 当你使用new/alloc或者copy方法创建一个对象时,该对象的保留计数器的值为1.当不在使用该对象时,你应该向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
- 当你通过其他方法获得一个对象时,假设该对象的保留计数器的值是1,而且已经被设置为自动释放,那么你不需要执行任何操作来确保该对象得到清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
- 如果你保留了某个对象,就需要释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
相关帖子
相关新闻
- OpenAI 发布 Swarm:一个用于构建、编排和部署多智能体系统的实验性人工智能框架
- SailPoint如何使用Anthropic的Claude在Amazon Bedrock上自动生成用于SaaS连接器的TypeScript代码 | Amazon Web Services
- 亚马逊Bedrock自定义模型导入现已正式可用 | 亚马逊网络服务
- 使用Amazon Transcribe和Amazon Bedrock Guardrails安全地总结通话记录 | Amazon Web Services
- Hugging Face的新工具让开发人员只需几分钟即可使用OpenAI构建具有人工智能功能的网络应用程序