首页 热点专区 小学知识 中学知识 出国留学 考研考公
您的当前位置:首页正文

Xcode调试技巧

2024-12-10 来源:要发发知识网

{

const char* filePath = [[URL path] fileSystemRepresentation];

const char* attrName = "com.apple.MobileBackup";

u_int8_t attrValue = 1;

int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);

return result == 0;

}

21、字符串截取

(1).截取字符串

NSString*string =@"sdfsfsfsAdfsdf";

string = [string substringToIndex:7];//截取下标7之后的字符串

NSLog(@"截取的值为:%@",string);

[string substringFromIndex:2];//截取下标2之前的字符串

NSLog(@"截取的值为:%@",string);

(2).匹配字符串

NSString*string =@"sdfsfsfsAdfsdf";

NSRangerange = [stringrangeOfString:@"f"];//匹配得到的下标

NSLog(@"rang:%@",NSStringFromRange(range));

string = [string substringWithRange:range];//截取范围类的字符串

NSLog(@"截取的值为:%@",string);

(3).分隔字符串

NSString*string =@"sdfsfsfsAdfsdf";

NSArray *array = [string componentsSeparatedByString:@"A"]; //从字符A中分隔成2个元素的数组

NSLog(@"array:%@",array); //结果是adfsfsfs和dfsdf

22.两次的间隔时间判断

//防止一直刷新积分 规定两次间隔20秒

NSTimeInterval _storedTimeInterval;

初始化:NSDate * nowDate = [NSDate date];

_storedTimeInterval = [nowDate timeIntervalSince1970];

判断:NSDate * nowDate = [NSDate date];

NSTimeInterval now = [nowDate timeIntervalSince1970];

int disValue = now - _storedTimeInterval;

if (disValue >= 20 ) {

_storedTimeInterval = now;

//XXXXXX处理

}

23、开启新线程

[NSThread detachNewThreadSelector:@selector(threadFunction) toTarget:self withObject:nil];

- (void)threadFunction{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [documentsDirectory stringByAppendingString:@"/test.txt"];

NSFileManager *fileManager =[NSFileManager defaultManager];

unsigned long long textSize = 0;

textSize = [[[fileManager attributesOfItemAtPath:path error:nil] objectForKey:NSFileSize] unsignedLongLongValue];

while (textSize == 0) {

[[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate distantFuture]];

textSize = [[[fileManager attributesOfItemAtPath:path error:nil] objectForKey:NSFileSize] unsignedLongLongValue];

}

}

首先是Run Loop的部分概念,它的作用就是循环、处理事件。具体来说有两个方面: 1. 定时启动任务(一般用和Timer协作);2. 处理事件。

在单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件(Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。

如果我们要写多线程的程序,可能就需要自己来管理Run Loop。

RunMode: NSDefaultRunLoopMode,可以把这个理解为一个”过滤器“,我们可以只对自己关心的事件进行监视。一般NSDefaultRunLoopMode是最常用的。

启动run loop的方法就是[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]],它的说明如下:

Runs the loop once, blocking for input in the specified mode until a given date.

启动run loop一次,在特定的run loop mode下等待输入。

如果没有附加input source或是timer,或是过limitDate,run loop就会退出,并且方法返回NO。

下来是Run Loop的使用场合:

1. 使用port或是自定义的input source来和其他线程进行通信

2. 在线程(非主线程)中使用timer

3. 使用 performSelector...系列(如performSelectorOnThread, ...)

4. 使用线程执行周期性工作

run loop不需要创建,在线程中只需要调用[NSRunLoop currentRunLoop]就可以得到

假设我们想要等待某个异步方法的回调。比如connection。如果我们的线程中没有启动run loop,是不会有效果的(因为线程已经运行完毕,正常退出了)。我们可以用一个条件来运行run loop

BOOL done = NO;

do

{

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]

}

while(!done);

显示全文