首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

object-c基础札记2

2012-11-23 
object-c基础笔记21.selector:相当于函数指针,oc中函数指针类型为SEL-(int) add:(int)valSEL class_func

object-c基础笔记2

1.selector:相当于函数指针,oc中函数指针类型为SEL

-(int) add:(int)val;

SEL class_func;

class_func = @selector(add:);

class_func 是当前类方法的指针

[object  @selector(add:)] 用于取object对应类中的方法的指针

NSSelectorFromString(方法名字符串),用于根据函数名来取对应函数的指针

反过来也可以:NSStringFromSelector(SEL)

冒号的规则(使用字符串查找的冒号规则也是这样的):

无参数的不需要冒号

-(void) fun;

@selector(fun);

一个参数加一个冒号:

-(void) fun:(int)a;

@selector(fun:);

两个及以上参数,第二个开始,每多一个参数,后面多加一个参数label和冒号

-(void) fun:(int)a  andparam2:(int)b;

@selector(fun:andparam2:);

执行:

[self performSelector:@selector(fun:andparam2:) withobject:1 withobject:2]


2.动态识别:

NSObject有一系列动态识别的接口,还有一个class方法返回一个class对象作为参数传给这些接口:

bool bFlag = [square isMemberOf :[Square class]];

isMemberOf:是否是某个类的对象

isKindOf:是否是某个类的或其子孙类的对象

3.NSLog:(使用c++的方式调用)

 NSLog(@"字符串第 %d 位为 %c",i,c); 

 NSLog(@"to = %@",to); 

4.SString 与 char* 的区别 

NSString是一个objective对象,而char* 是一个字节数组。@+ " 字符串 " 这个符号为objective-c NSString 字符串常量的标准用法,char* 创建的时候 无需添加@

char*c = "xuanyusong";
NSString *temp = @"我是临时字符串";

const char *strTemp = [temp UTF8String];//NSString是unicode,转成utf8字符串

5.bool型真为YES,假为NO(true和false也行,但不建议)

6.数组:

NSArray:创建一个不可变的数组,一旦初始化完毕后这个数组的元素是不可以在动态的添加与删除。只能存NSObject,不能存基本类型(字符串不是基本类型)

mArray = [[NSArray alloc] initWithObjects:@“a”,self,nil];

遍历:

#import <UIKit/UIKit.h>
#import "MyClass.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//添加我们的测试代码


//创建自定义类
MyClass *myClass = [[MyClass alloc]init];

//创建一个不可变的数组
NSArray *array= [NSArray arrayWithObjects:@"雨松", @"MOMO",@"哇咔咔",myClass,nil];
//得到数组的长度
int count = [array count];
//遍历这个数组
for (int i = 0; i < count; i++) {
NSLog(@"普通的遍历:i = %d 时的数组对象为: %@",i,[array objectAtIndex: i]);
}


int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;

或:

#import <UIKit/UIKit.h>
#import "MyClass.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//添加我们的测试代码


//创建自定义类
MyClass *myClass = [[MyClass alloc]init];

//创建一个不可变的数组
NSArray *array= [NSArray arrayWithObjects:@"雨松", @"MOMO",@"哇咔咔",myClass,nil];

//遍历这个数组
for (NSObject *object in array) {
NSLog(@"快速的遍历数组对象为: %@",object);
}


int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

数组必须以nil结束,指针打印的是地址

NSMutableArray :可变数组

#import <UIKit/UIKit.h>
#import "MyClass.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//添加我们的测试代码


//创建自定义类
MyClass *myClass = [[MyClass alloc]init];

//创建一个可变的数组长度为10
NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];


//向数组中动态的添加对象
[array addObject:@"雨松"];
[array addObject:@"MOMO"];
[array addObject:@"小可爱"];
[array addObject:@"哇咔咔"];

[array addObject:myClass];



for (NSObject * object in array)
{
NSLog(@"输出对象数组:%@", object);
}


int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

[NSMutableArray arrayWithCapacity:10] :初始化可变数组对象的长度,如果后面代码继续添加数组超过长度10以后NSMutableArray的长度会自动扩充,所以不用担心数组越界。[array addObject:...] : 向可变数组尾部添加数据对象。[array insertObject:@"插入一只小老虎" atIndex:1] :向可变数组中插入一个字符串对象,并且设定它的位置脚标索引为 1。

NSRange range = NSMakeRange(0,5); 设置一个范围为 0 到 5 之间。[array removeObject:myClass inRange:range] : 设置在一个范围内删除数据,如果这个范围内没有删除的这个对象则不会删除任何东西。7.NSString,NSMutableString是unicode格式,XCode默认编码为UTF-8,所以char*转NSString要指定原编码为UTF-8

NSString *str3 = [NSString stringWithUTF8String:"中国"];//没有加@,说明是char*,默认是UTF-8编码的

8.NSMutableString:可变的字符串

NSMutableString *str = [NSMutableString stringWithString:@"中国"];//有加@,说明是NSString,无需转换

NSMutableString *str2;

str2 = str;

[str insertString:@"深圳" atIndex:0]; //str2也跟着变化了,因为是指向同一个对象的指针


9.字符串跟其他类型之间转换:

NSString *str0 = @"1121";

//把字符串强转成整型
int i = [str0 intValue]; //i值为10,如果是非数组字符串转成数字,转换后的数组为0


10.static变量:

警告:  static 写在interface外面编译是没有错误的,但是编译器会报警告,这么说这样的写法是不被编辑器认可的。错误:static 写在interface里面会直接报错,显然这样的语法是不被认可的。#import <Foundation/Foundation.h>
//警告
//static int sCount ;

@interface MyClass : NSObject
{
//错误的写法
//static int sCount;

}
+(void) addCount;

@end

正确的写法是把static变量写在.m文件里:

#import "MyClass.h"


static int sCount = 100;

@implementation MyClass


+(void)addCount
{
sCount ++;
NSLog(@"静态整型变量的值为:%d", sCount);
}

@end

也可以写在方法中,作为局部变量:

+(void)addCount
{
static int sCount = 100;
sCount ++;
NSLog(@"静态整型变量的值为:%d", sCount);
}

不管怎么写,静态变量只初始化一次,就是在程序刚调用起来的时候,所以上面的两个static初始化语句

static int sCount = 100; 

都只执行一次,sCount ++; 调用多少次就执行多少次

没有赋初始值时,static int变量默认初始赋值为0


11.字典:NSDictionary (不可变),NSMutableDictionary(可变),同一个词典对象中可以保存多个不同类型的数据,不像JavaC只能保存声明的相同类型的数据

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"niuzai",@"name",@"13225455896",@"number", nil];  

注意key值是在value后面的


12.NSSet,NSMutableSet:集合,里面的元素是按哈希算法无序存放的,NSArrayNSMutableArray是有序存放的,放在一整块内存中,set的查找效率高(哈希算法)


热点排行