NSClassFromString
2010年11月06日
NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。
正常来说,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
比如在iPhone中,NSTask可能就会出现这种情况,所以在你需要使用NSTask时,最好使用:
[[NSClassFromString(@"NSTask") …..]]
而不要直接使用[NSTask …]这种写法。
NSClassFromString的好处是:
1 弱化连接,因此并不会把没有的Framework也link到程序中。
2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用 的,那么也可以用这种方法。
Iphone开发问题集[转]哎,好长时间没有怎么看书了,写的程序也少了点了,今天又过了写点东西的时候手又生疏了,好多都还有找,开这个blog写下我经常忘记的东西,呵呵,方便 以后查阅。
1.设置tag方便使用
在cell中放入多个控件的时候使用tag很方便的区分。在其他的地方使用tag也方便编程。呵呵
2.今天试验一个关于删除的问题,也就是直接在cell中添加一个按钮,点击按钮实现删除操作,这个应该是Apple不允许的,没有设置到编辑模式,我使 用的是直接reload数据源的方法,但是发现一个问题,也就是在选中该行的时候我想保存该行的行数,但是我保存不了,也不知道是为什么,难道是 delegate的缘故,还是第一次点该行再次点的时候呢个值已经变了,但是我看的时候是空,郁闷。最后我是用NSMutableArray来实现的,在 选中该行的时候我让NSMutableArray对象addObject该行然后在使用的时候取第一个值也就是NSMUtableArray ObjectAtIndex:0呵呵具体成果了。原理还在摸索中。
3.UITableViewCell的重用机制
UITableViewCell在加载的时候只更新内容,也就是说如果你在加载cell的时候在cell中加入button假如100个cell,你设置 tag的时候是更加row加入,你想的到得tag是从0到99,但是结果不是呢样的,如果你tableview能显示10个cell呢tag应该只有 10,在你向下拉的时候更改的仅仅是显示的内容。具体的重用机制还需要更深入研究。
4.NSArray初始化的时候,今天很晕,刚开始做的第一个程序我在初始化NSArray的时候居然这样搞了一下
NSArray *array = [[NSArray alloc]initWithObjects:(@”a”,@”b”,nil)];编译也没有错误,运行没结果,呵呵。去掉括号,没问题了。受C的影响。
5。向UINavigation添加tableView。
table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];
[table setDelegate:self];
[table setDataSource:self];
[self.view addSubview:table];
6.得到Button的title
UIButton *but = [[UIbutton alloc] init];
[but setTitle:@"title" forState:UIControlStateNormal];
[but addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
-(void)click:(id)sender
{
NSString *s = [sender titleForState:UIControlStateNormal];
}
7.对字符串的截取操作。按照“|”实现分割,去掉后面的数字只要前面部分
NSString *s = @”哈根达斯,4223|帝王蟹,3717|三文鱼,3255|提拉米苏,2733|生蚝,1860|烤鳗,1451|生鱼片,1430|龙虾色 拉,1252|北极贝,1230|鲍鱼片,772|芒果冰沙,730|烤鳗鱼,706|龙虾沙拉,692|海鲜泡饭,600|冰淇淋,508|芒果 汁,499|鲍片,357|佛跳墙,308|鲍鱼,295|HGDS,262 “;
NSMutableArray *array = [[s componentsSeparatedByString:@"|"]retain];
NSMutableArray *mutablearray = [[NSMutableArray alloc] init];
int i = 0;
for(i; i Window -> Organizer来启动。这样就会在程序加载前的呢一会黑屏中运行该画面!
15.播放caf音频文件
引入AudioToolbox.framework。导入音频文件,声明变量SystemSoundID sound1;
NSString *path1 = [[NSBundle mainBundle] pathForResource:@”sound1″ ofType:@”caf”];获取音频文件路径
CFURLRef sound1URL = (CFURLRef)[NSURL fileURLWithPath:path1];将路径转换为CFURLRef
AudioServicesCreateSystemSoundID(sound1URL, &sound1);加载音频文件并与指定soundID联系起来
然后在需要播放的地方加入AudioServicesPlayAlertSound(sound1);就可以了。
16.将view设置成圆角
今天从CC上看到的,实验了一下,效果挺好的。呵呵
首先导入QuartzCore.framework,#import
然后添加下面两行代码:
view.layer.cornerRadius = 8;//圆角
view.layer.masksToBounds = YES;//在所在的层绘制圆角
17.设置坐标和大小
CGPoint a = CGPointMake(10,20);
CGSize b = CGSizeMake(40,40);
CGRect aa = CGRectMake(10, 30, 240, 240);
18.把UIColor转换为CGColor
UIColor *redColor = [UIColor redColor];
CGColor *RedColor = redColor.CGColor;
19.CALayer就是层,这个层你随便控制他的大小,旋转,角度,坐标变化或者内容之类的信息,这些变化还可以通过动画表现出来。UIView所有你 能看到的显示的内容,后面都有一个Layer。下面来自定义添加一个CALayer。
CALayer *layer = [[CALayer alloc] init];//定义一个layer
CGRect aa = CGRectMake(10, 30, 240, 240);//设置该layer的坐标和大小
layer.frame = aa;
UIColor *c = [UIColor redColor];
[layer setBackgroundColor:(c.CGColor)];//设置该layer的背景,因为layer setBackgroundColor用到的是CGColor所以要进行一次转换
[self.view.layer insertSublayer:layer atIndex:0];//在self view中添加该layer
20.在使用Xcode编写程序的时候,在类方法上面option + 双击就可以跳到Document中的相关说明下面,很方便!
21.命令行解压tgz文件:
tar xzvf filename
22.从网络下载图片并显示,原以为很难,今天看到UIImage有imageWithData这个方法,试一下就出来了。
NSURL *url = [NSURL URLWithString:@"XXXX"];
NSData *picData = [NSData dataWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:picData];
[imageView setImage:img];
23.NSTimer传参数。
我们在使用NSTimer定时的时候有的时候需要传过去一个参数。我们可以这样来传参数。
首先定义NSTimer
NSTimer *timer;
timer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(onTimer:) userInfo:parameter repeats:YES];
然后再onTimer事件中使用[time userInfo];就可以了。传什么类型在onTimer中使用对应类型就好了。
24.关于线程。在自己创建的子线程中不可以对控件进行操作。线程中需要使用NSAutoreleasePool。
[NSThread detachNewThreadSelector:@selector(threadMethod:) toTarget:self withObject:nil];
-(void)threadMethod:(NSString *)s{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self performSelectorOnMainThread:@selector(method:) withObject:nil waitUntilDone:YES];//这样就可以在主线程中进行控件的操作
[NSThread exit];
[pool release];
}
-(void)method{
………………
}
25.UIAlertView提示上面按钮触发的事件,根据选择的按钮触发不同的事件。
[alert addButtonWithTitle:@"YES"];
[alert addButtonWithTitle:@"NO"];
YES按钮返回的buttonIndex是0,NO按钮返回的buttonIndex是1这样就可以在下面的委托事件中使用了
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
26.更改cell选中后的颜色
cell.selectionStyle = UITableViewCellSelectionStyleGray;
27.使用IB添加tabbarcontroller后crash问题
用ib添加一个tabbarcontroller,里面放5个tabbaritems,关联5个xib文件。
其中5个xib文件都是OK的。想着就ok了,结果运行的时候只要每一个view里面有controller操作,就会crash。实在是找不到原因,最 后请教高人,原来是IB弄错了。关联tabbaritems后还有关联相应的controller类。
在这里:
其中class里面默认的是UIViewController,这里必须选择每一个view对应的controller类。
28.让label自适应里面的文字,自动调整宽度和高度。
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,0,0)];这个frame是初设的,没关系,后面还会重新设置其size。
[label setNumberOfLines:0];
NSString *s = @”string……”;
UIFont *font = [UIFont fontWithName:@"Arial" size:12];
CGSize size = CGSizeMake(320,2000);
CGSize labelsize = [s sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap];
[label setFrame:CGRectMake:(0,0, labelsize.width, labelsize.height)];
[self.view addSubView:label];
这样就可以对s赋值让其自动调整其大小了。其实宽度可以设置为固定,让其改高度更好。呵呵
29.在tableview中选种一行,当失去焦点的时候选 种行的颜色自动消失。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[table deselectRowAtIndexPath:[table indexPathForSelectedRow] animated:YES];
}
30。有用的色彩搭配表
http://www.print100.com/hk/html/csi.aspx
nsdata#import
/**
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中的alertUIAlertView *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 开发过程中,内存的使用至关重要。不但要合理分配使用内存,还要注意内存泄露的问题, 因为内存泄露会导致程序由于内存不足而崩溃。根据个人开发的经验来看,在开发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
#import
srandom()的使用
srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));
直接使用 random() 来调用随机数
[b]2 在UIImageView 中旋转图像[/b]
float rotateAngle = M_PI;
CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle);
imageView.transform = transform;
以上代码旋转imageView, 角度为rotateAngle, 方向可以自己测试哦!
[b]3 在Quartz中如何设置旋转点[/b]
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]];
imageView.layer.anchorPoint = CGPointMake(0.5, 1.0);
这个是把旋转点设置为底部中间。记住是在QuartzCore.framework中才得到支持。
[b]4 创建.plist文件并存储[/b]
NSString *errorDesc; //用来存放错误信息
NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件可以直接转化为plist文件
NSDictionary *innerDict;
NSString *name;
Player *player;
NSInteger saveIndex;
for(int i = 0; i 里的内容
while(tmp = [nse nextObject]) {
NSString *stringBetweenBrackets = nil;
NSScanner *scanner = [NSScanner scannerWithString:tmp];
[scanner scanUpToString:@"" intoString:&stringBetweenBrackets];
NSLog([stringBetweenBrackets description]);
}
对于读写文件,还有补充,暂时到此。随机数和文件读写在游戏开发中经常用到。所以把部分内容放在这,以便和大家分享,也当记录,便于查找。
[b]6 隐藏NavigationBar[/b]
[self.navigationController setNavigationBarHidden:YES animated:YES];
在想隐藏的ViewController中使用就可以了。
random()函数的使用介绍1、首先要让大家知道的是,random()在程序中调用是按时间来进行排序的,从你开始调用random()函数起程序就按照时间进行顺序的产生随机 数,每次应用程序开始,时间都会重置,故会出现每次开启应用程序,随机数虽然时随机的,但是顺序时固定的,大家应该先知道这个原理
2、如何让一个random()函数在每次开启程序时无顺序呢?小弟不才,结合OpenGL中的原理,进行了尝试。在你调用random()函数之前,首先写一个方法,该方法为:srandom(time(NULL));
该方法的意思就是让以后的随机数不再按时间进行排序,此后你如果再使用random()方法便不用担心它的顺序随机了。
例:
srandom(time(NULL));for(int i = 0; i<10; i++){ NSLog(@”%d”,random());}复制代码
试一下,看看其结果,是不是不再顺序随机了。
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开发-移除UIView中的所有对象循环移除UIView中的所有对象:
for (UIView *sub in [self.view subviews]){
[sub removeFromSuperview];
}
2010年11月06日
NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。
正常来说,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
比如在iPhone中,NSTask可能就会出现这种情况,所以在你需要使用NSTask时,最好使用:
[[NSClassFromString(@"NSTask") …..]]
而不要直接使用[NSTask …]这种写法。
NSClassFromString的好处是:
1 弱化连接,因此并不会把没有的Framework也link到程序中。
2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用 的,那么也可以用这种方法。
Iphone开发问题集[转]哎,好长时间没有怎么看书了,写的程序也少了点了,今天又过了写点东西的时候手又生疏了,好多都还有找,开这个blog写下我经常忘记的东西,呵呵,方便 以后查阅。
1.设置tag方便使用
在cell中放入多个控件的时候使用tag很方便的区分。在其他的地方使用tag也方便编程。呵呵
2.今天试验一个关于删除的问题,也就是直接在cell中添加一个按钮,点击按钮实现删除操作,这个应该是Apple不允许的,没有设置到编辑模式,我使 用的是直接reload数据源的方法,但是发现一个问题,也就是在选中该行的时候我想保存该行的行数,但是我保存不了,也不知道是为什么,难道是 delegate的缘故,还是第一次点该行再次点的时候呢个值已经变了,但是我看的时候是空,郁闷。最后我是用NSMutableArray来实现的,在 选中该行的时候我让NSMutableArray对象addObject该行然后在使用的时候取第一个值也就是NSMUtableArray ObjectAtIndex:0呵呵具体成果了。原理还在摸索中。
3.UITableViewCell的重用机制
UITableViewCell在加载的时候只更新内容,也就是说如果你在加载cell的时候在cell中加入button假如100个cell,你设置 tag的时候是更加row加入,你想的到得tag是从0到99,但是结果不是呢样的,如果你tableview能显示10个cell呢tag应该只有 10,在你向下拉的时候更改的仅仅是显示的内容。具体的重用机制还需要更深入研究。
4.NSArray初始化的时候,今天很晕,刚开始做的第一个程序我在初始化NSArray的时候居然这样搞了一下
NSArray *array = [[NSArray alloc]initWithObjects:(@”a”,@”b”,nil)];编译也没有错误,运行没结果,呵呵。去掉括号,没问题了。受C的影响。
5。向UINavigation添加tableView。
table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];
[table setDelegate:self];
[table setDataSource:self];
[self.view addSubview:table];
6.得到Button的title
UIButton *but = [[UIbutton alloc] init];
[but setTitle:@"title" forState:UIControlStateNormal];
[but addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
-(void)click:(id)sender
{
NSString *s = [sender titleForState:UIControlStateNormal];
}
7.对字符串的截取操作。按照“|”实现分割,去掉后面的数字只要前面部分
NSString *s = @”哈根达斯,4223|帝王蟹,3717|三文鱼,3255|提拉米苏,2733|生蚝,1860|烤鳗,1451|生鱼片,1430|龙虾色 拉,1252|北极贝,1230|鲍鱼片,772|芒果冰沙,730|烤鳗鱼,706|龙虾沙拉,692|海鲜泡饭,600|冰淇淋,508|芒果 汁,499|鲍片,357|佛跳墙,308|鲍鱼,295|HGDS,262 “;
NSMutableArray *array = [[s componentsSeparatedByString:@"|"]retain];
NSMutableArray *mutablearray = [[NSMutableArray alloc] init];
int i = 0;
for(i; i Window -> Organizer来启动。这样就会在程序加载前的呢一会黑屏中运行该画面!
15.播放caf音频文件
引入AudioToolbox.framework。导入音频文件,声明变量SystemSoundID sound1;
NSString *path1 = [[NSBundle mainBundle] pathForResource:@”sound1″ ofType:@”caf”];获取音频文件路径
CFURLRef sound1URL = (CFURLRef)[NSURL fileURLWithPath:path1];将路径转换为CFURLRef
AudioServicesCreateSystemSoundID(sound1URL, &sound1);加载音频文件并与指定soundID联系起来
然后在需要播放的地方加入AudioServicesPlayAlertSound(sound1);就可以了。
16.将view设置成圆角
今天从CC上看到的,实验了一下,效果挺好的。呵呵
首先导入QuartzCore.framework,#import
然后添加下面两行代码:
view.layer.cornerRadius = 8;//圆角
view.layer.masksToBounds = YES;//在所在的层绘制圆角
17.设置坐标和大小
CGPoint a = CGPointMake(10,20);
CGSize b = CGSizeMake(40,40);
CGRect aa = CGRectMake(10, 30, 240, 240);
18.把UIColor转换为CGColor
UIColor *redColor = [UIColor redColor];
CGColor *RedColor = redColor.CGColor;
19.CALayer就是层,这个层你随便控制他的大小,旋转,角度,坐标变化或者内容之类的信息,这些变化还可以通过动画表现出来。UIView所有你 能看到的显示的内容,后面都有一个Layer。下面来自定义添加一个CALayer。
CALayer *layer = [[CALayer alloc] init];//定义一个layer
CGRect aa = CGRectMake(10, 30, 240, 240);//设置该layer的坐标和大小
layer.frame = aa;
UIColor *c = [UIColor redColor];
[layer setBackgroundColor:(c.CGColor)];//设置该layer的背景,因为layer setBackgroundColor用到的是CGColor所以要进行一次转换
[self.view.layer insertSublayer:layer atIndex:0];//在self view中添加该layer
20.在使用Xcode编写程序的时候,在类方法上面option + 双击就可以跳到Document中的相关说明下面,很方便!
21.命令行解压tgz文件:
tar xzvf filename
22.从网络下载图片并显示,原以为很难,今天看到UIImage有imageWithData这个方法,试一下就出来了。
NSURL *url = [NSURL URLWithString:@"XXXX"];
NSData *picData = [NSData dataWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:picData];
[imageView setImage:img];
23.NSTimer传参数。
我们在使用NSTimer定时的时候有的时候需要传过去一个参数。我们可以这样来传参数。
首先定义NSTimer
NSTimer *timer;
timer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(onTimer:) userInfo:parameter repeats:YES];
然后再onTimer事件中使用[time userInfo];就可以了。传什么类型在onTimer中使用对应类型就好了。
24.关于线程。在自己创建的子线程中不可以对控件进行操作。线程中需要使用NSAutoreleasePool。
[NSThread detachNewThreadSelector:@selector(threadMethod:) toTarget:self withObject:nil];
-(void)threadMethod:(NSString *)s{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self performSelectorOnMainThread:@selector(method:) withObject:nil waitUntilDone:YES];//这样就可以在主线程中进行控件的操作
[NSThread exit];
[pool release];
}
-(void)method{
………………
}
25.UIAlertView提示上面按钮触发的事件,根据选择的按钮触发不同的事件。
[alert addButtonWithTitle:@"YES"];
[alert addButtonWithTitle:@"NO"];
YES按钮返回的buttonIndex是0,NO按钮返回的buttonIndex是1这样就可以在下面的委托事件中使用了
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
26.更改cell选中后的颜色
cell.selectionStyle = UITableViewCellSelectionStyleGray;
27.使用IB添加tabbarcontroller后crash问题
用ib添加一个tabbarcontroller,里面放5个tabbaritems,关联5个xib文件。
其中5个xib文件都是OK的。想着就ok了,结果运行的时候只要每一个view里面有controller操作,就会crash。实在是找不到原因,最 后请教高人,原来是IB弄错了。关联tabbaritems后还有关联相应的controller类。
在这里:
其中class里面默认的是UIViewController,这里必须选择每一个view对应的controller类。
28.让label自适应里面的文字,自动调整宽度和高度。
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,0,0)];这个frame是初设的,没关系,后面还会重新设置其size。
[label setNumberOfLines:0];
NSString *s = @”string……”;
UIFont *font = [UIFont fontWithName:@"Arial" size:12];
CGSize size = CGSizeMake(320,2000);
CGSize labelsize = [s sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap];
[label setFrame:CGRectMake:(0,0, labelsize.width, labelsize.height)];
[self.view addSubView:label];
这样就可以对s赋值让其自动调整其大小了。其实宽度可以设置为固定,让其改高度更好。呵呵
29.在tableview中选种一行,当失去焦点的时候选 种行的颜色自动消失。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[table deselectRowAtIndexPath:[table indexPathForSelectedRow] animated:YES];
}
30。有用的色彩搭配表
http://www.print100.com/hk/html/csi.aspx
nsdata#import
/**
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中的alertUIAlertView *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 开发过程中,内存的使用至关重要。不但要合理分配使用内存,还要注意内存泄露的问题, 因为内存泄露会导致程序由于内存不足而崩溃。根据个人开发的经验来看,在开发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
#import
srandom()的使用
srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));
直接使用 random() 来调用随机数
[b]2 在UIImageView 中旋转图像[/b]
float rotateAngle = M_PI;
CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle);
imageView.transform = transform;
以上代码旋转imageView, 角度为rotateAngle, 方向可以自己测试哦!
[b]3 在Quartz中如何设置旋转点[/b]
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]];
imageView.layer.anchorPoint = CGPointMake(0.5, 1.0);
这个是把旋转点设置为底部中间。记住是在QuartzCore.framework中才得到支持。
[b]4 创建.plist文件并存储[/b]
NSString *errorDesc; //用来存放错误信息
NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件可以直接转化为plist文件
NSDictionary *innerDict;
NSString *name;
Player *player;
NSInteger saveIndex;
for(int i = 0; i 里的内容
while(tmp = [nse nextObject]) {
NSString *stringBetweenBrackets = nil;
NSScanner *scanner = [NSScanner scannerWithString:tmp];
[scanner scanUpToString:@"" intoString:&stringBetweenBrackets];
NSLog([stringBetweenBrackets description]);
}
对于读写文件,还有补充,暂时到此。随机数和文件读写在游戏开发中经常用到。所以把部分内容放在这,以便和大家分享,也当记录,便于查找。
[b]6 隐藏NavigationBar[/b]
[self.navigationController setNavigationBarHidden:YES animated:YES];
在想隐藏的ViewController中使用就可以了。
random()函数的使用介绍1、首先要让大家知道的是,random()在程序中调用是按时间来进行排序的,从你开始调用random()函数起程序就按照时间进行顺序的产生随机 数,每次应用程序开始,时间都会重置,故会出现每次开启应用程序,随机数虽然时随机的,但是顺序时固定的,大家应该先知道这个原理
2、如何让一个random()函数在每次开启程序时无顺序呢?小弟不才,结合OpenGL中的原理,进行了尝试。在你调用random()函数之前,首先写一个方法,该方法为:srandom(time(NULL));
该方法的意思就是让以后的随机数不再按时间进行排序,此后你如果再使用random()方法便不用担心它的顺序随机了。
例:
srandom(time(NULL));for(int i = 0; i<10; i++){ NSLog(@”%d”,random());}复制代码
试一下,看看其结果,是不是不再顺序随机了。
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开发-移除UIView中的所有对象循环移除UIView中的所有对象:
for (UIView *sub in [self.view subviews]){
[sub removeFromSuperview];
}