存档

‘iPhone’ 分类的存档

nsdata

2010年7月13日 没有评论

#import <Foundation/Foundation.h>
/**
NSData 对象是不可变的,它被创建后就不能改变。NSMutableData支持正数据内容中添加和删除字节
*/
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

const char *string=”hi there,this is a c string”;
//NSData 包装了大量的字节,可以获得数据的长度和指向字节起始位置的指针。
//如果将数据块传递给一个函数或方法,可以通过传递一个自动释放的NSData来实现,无需担心内存清除问题
//strlen(string)+1,它用于包含c字符串的尾部的零字节,通过包含零字节,可以使用%s格式的说明 符输出字符串
NSData *data=[NSData dataWithBytes:string length:strlen(string)+1];
NSLog(@”——%@”,data);

NSLog(@”length=%d,string=’%s’”,[data length],[data bytes]);
//atomically:设置为true或者yes,好像没有什么区别
[data writeToFile:@"/tmp/ss.txt" atomically:TRUE];

[pool drain];
return 0;
}

分类: iPhone 标签: ,

iPhone中的alert

2010年3月25日 没有评论

UIAlertView *alertstart;
alertstart = [[UIAlertView alloc] initWithTitle:@”Message” message:@”Congratulations!” delegate:self cancelButtonTitle:nil otherButtonTitles:@”Replay”,@”Exit”,nil];

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if(buttonIndex == 0){
[self replayGame];   //开始游戏
}else if(buttonIndex == 1){
[self playExample]; //播放示例
}//end if
[alertView release];
}

分类: iPhone 标签: ,

iPhone 开发中如何合理使用内存

2010年3月23日 没有评论

iPhone 开发过程中,内存的使用至关重要。不但要合理分配使用内存,还要注意内存泄露的问题, 因为内存泄露会导致程序由于内存不足而崩溃。根据个人开发的经验来看,在开发iPhone程序的过程中,关于内存的问题需要注意以下几点:

内存分配、释放成对出现

使用 alloc 分配的内存对象需要在用完后 调用release释放

注意copy,retain,assign操作符的区别

copy, retain操作符赋值的对象和alloc一样,需要release释放,否则会导致内存泄露

assign 操作符的含义是将对象指向另一对象, 两者指向的是同一内存对象,无需调用release释放

NSArray, NSDictionary, NSMutableArray, NSMutableDictionary等容器类, 在使用这些容器类的时候要注意, 在添加对象到这些类对象时,容器类会自动调用一次retain,比如

NSString* string = [[NSString alloc] initWithString:@”test string”]; // refCount = 1

NSArray* array = [NSArray array];

[array addObject:string]; // refCount = 2

[string release]; // refCount = 1

这种情况, 即便string已经调用release,但是在加入 array中时已经调用了一次retain,注意refCount的变化

简单介绍一下iPhone 或者说Objective C对对象的管理机制。 OC中采用一种引用计数refCount的方式来管理内存对象,当refCount等于0的时候就会释放对象所占的内存, 操作符alloc,copy, retain都会将refCount加1表示引用计数增加, 而调用release使 refCount自动减1,当refCount=0时表示该对象已经没有被引用,可以将其释放, 之后该对象便不可用

连续重复分配内存的过程最好创建自己的自动释放池 NSAutoreleasePool,通常是在for、while等循环操作过程中,比如

for( int i=0; i < 100; i++ )

{

NSString* str = [[NSString alloc] initWithString:@”some string”];

// 针对str的操作

[str release];

}

在这种情况下,有2点需要注意,首先如果可能,就把str的分配、释放放在for循环外面, 从而减少内存的分配、释放导致程序效率低下,也利于内存回收,如上例应该为

NSString* str = [[NSString alloc] initWithString:@”some string”];

分类: iPhone 标签:

Objective-C中切分数组

2010年3月23日 没有评论

在很多脚本语言如ruby,python中都有将字符串切分成数组或者将数组元素以某个间隔字符串间隔形成新的数组。 其实NSArray也提供了这样的功能。

使用-componentsSeparatedByString:来切分NSArray。 如:
NSString *string = @”white:black:blue:red”;
NSArray *aArray = [string componentsSeparatedByString:@":"];

用-componentsJoinedByString:来合并NSArray中的各个元素并创建一个新的字符串,如:
string = [aArray componentsJoinedByString:@","];

这样,上面的数组就中的各个元素就以”,”分割形成一个字符串。

分类: iPhone 标签: , ,

iphone开发 关于数组中不能存放nil的原因及解决办法

2010年3月23日 没有评论

在编程过程中,我们会遇到这种问题:

  1. NSMutableArray *mutArray = [[NSMutableArray alloc] initWithObjects:@”a”,@”b”,@”c”,nil];


我们生成了一个数组,但是当我们想把第一个位置b元素 替换成空,但是保留其空间,我们该怎么办?用nil吧?这是不行的,其原因有二:
1、数组或者字典中,是以nil作为它们存放元素结束的标识符,如果我们在第一个位置将b元素换成nil,则结果mutArray中就仅剩下a元素了。而 c元素就不存在了,因为a元素后面的nil就告诉数组存放元素结束了。如果我们试图使用

  1. [mutArray ObjectAtIndex:2];


去访问数据,则系统则会提示数组越界错误。
2、另外,枚举NSEnumerator也是数组不能存放nil的另一个原因。

  1. NSEnumrator *enumrator = [mutArray objectEnumrator];//向数组请求枚举器
  2. while((id)thing = [enumrator nextObject]){
  3. NSLog(“I Found %@”,thing);
  4. }

它 通过循环遍历整个集合,直到nextObject为nil时,循环结束。

以上便是数组中不能存放nil的原因了。

但是,我们该如何解决呢?我们确实想让它作为空元素,但是空间仍能够存在,怎么办?
我们可以使用NSNull类来解决,它仅仅有一个方法+(NSNull *)null;

如上mutArray替代b元素,我们这样使用:

  1. [mutArray replaceObjectAtIndex:1 withObject:[NSNull null]];

这样,数组中长度仍为3,但是b元素处已被“什么都没 有”替代了!

分类: iPhone 标签: ,

iPhone 开发过程中的一些小技术的总结

2010年3月17日 没有评论

1 随机数的使用

头文件的引用
#import <time.h>
#import <mach/mach_time.h>

srandom()的使用
srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));

直接使用 random() 来调用随机数

2 在UIImageView 中旋转图像

float rotateAngle = M_PI;
CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle);
imageView.transform = transform;

以上代码旋转imageView, 角度为rotateAngle, 方向可以自己测试哦!

3 在Quartz中如何设置旋转点

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]];
imageView.layer.anchorPoint = CGPointMake(0.5, 1.0);

这个是把旋转点设置为底部中间。记住是在QuartzCore.framework中才得到支持。

4 创建.plist文件并存储

NSString *errorDesc;  //用来存放错误信息
NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件可以直接转化为plist文件
NSDictionary *innerDict;
NSString *name;
Player *player;
NSInteger saveIndex;

for(int i = 0; i < [playerArray count]; i++) {
player = nil;
player = [playerArray objectAtIndex:i];
if(player == nil)
break;
name = player.playerName;// This “Player1″ denotes the player name could also be the computer name
innerDict = [self getAllNodeInfoToDictionary:player];
[rootObj setObject:innerDict forKey:name]; // This “Player1″ denotes the person who start this game
}
player = nil;
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc];

红色部分可以忽略,只是给rootObj添加一点内容。这个plistData为创建好的plist文件,用其writeToFile方法就可以写成文件。下面是代码:

/*得到移动设备上的文件存放位置*/
NSString *documentsPath = [self getDocumentsDirectory];
NSString *savePath = [documentsPath stringByAppendingPathComponent:@"save.plist"];

/*存文件*/
if (plistData) {
[plistData writeToFile:savePath atomically:YES];
}
else {
NSLog(errorDesc);
[errorDesc release];
}

- (NSString *)getDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}

4 读取plist文件并转化为NSDictionary

NSString *documentsPath = [self getDocumentsDirectory];
NSString *fullPath = [documentsPath stringByAppendingPathComponent:@"save.plist"];
NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath];

5 读取一般性文档文件

NSString *tmp;
NSArray *lines; /*将文件转化为一行一行的*/
lines = [[NSString    stringWithContentsOfFile:@"testFileReadLines.txt"]
componentsSeparatedByString:@”\n”];

NSEnumerator *nse = [lines objectEnumerator];

// 读取<>里的内容
while(tmp = [nse nextObject]) {
NSString *stringBetweenBrackets = nil;
NSScanner *scanner = [NSScanner scannerWithString:tmp];
[scanner scanUpToString:@"<" intoString:nil];
[scanner scanString:@"<" intoString:nil];
[scanner scanUpToString:@">" intoString:&stringBetweenBrackets];

NSLog([stringBetweenBrackets description]);
}

对于读写文件,还有补充,暂时到此。随机数和文件读写在游戏开发中经常用到。所以把部分内容放在这,以便和大家分享,也当记录,便于查找。

6 隐藏NavigationBar
[self.navigationController setNavigationBarHidden:YES animated:YES];

在想隐藏的ViewController中使用就可以了。

分类: iPhone 标签:

random()函数的使用介绍

2010年3月17日 没有评论

1、首先要让大家知道的是,random()在程序中调用是按时间来进行排序的,从你开始调用random()函数起程序就按照时间进行顺序的产生随机 数,每次应用程序开始,时间都会重置,故会出现每次开启应用程序,随机数虽然时随机的,但是顺序时固定的,大家应该先知道这个原理
2、如何让一个random()函数在每次开启程序时无顺序呢?小弟不才,结合OpenGL中的原理,进行了尝试。在你调用random()函数之前,首先写一个方法,该方法为:srandom(time(NULL));
该方法的意思就是让以后的随机数不再按时间进行排序,此后你如果再使用random()方法便不用担心它的顺序随机了。
例:

  1. srandom(time(NULL));
  2. for(int i = 0; i<10; i++){
  3. NSLog(@”%d”,random());
  4. }

复制代码

试一下,看看其结果,是不是不再顺序随机了。
3、说到随机数,我还有些研究,随机数不仅用random(),还可以使用rand(),同样有srand(time(NULL));但是,在不使用 srand(time(NULL))之前,rand()的第一个随机值是16807,而random()的随机值第一个随机值是1804289383;这 就是说程序默认的随机数调用的是srand(1)或者srandom(1);你如果设置一下为srand(2),它第一个随机数便不再是16807,而是 33614,设为srand(3),则第一个随机数便是50421。这只是srand(..)的情况,如果是srandom(..),则无规律可谈。

分类: iPhone 标签: ,

iPhone开发-移除UIView中的所有对象

2010年3月17日 没有评论

循环移除UIView中的所有对象:
for (UIView *sub in [self.view subviews]){
[sub removeFromSuperview];
}

分类: iPhone 标签: , ,