借此贴总结一下自己今天把一个证书放到两个机器上 的经历:
http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/128-Managing_Devices_and_Digital_Identities/devices_and_identities.html
首先就是按照下面说的:
When you request a certificate from the iPhone Provisioning Portal, a public/private key pair is generated. The public key is included in your certificate. The private key is stored in your keychain. With these items, Xcode code-signs the applications you build with it. If you need to use another computer to develop iOS applications, you must transfer these digital-identification items to the other computer. You can do this in the Xcode Organizer.
To export your digital-identification items to a secure file, follow these steps:
Open the Xcode Organizer.
In the IPHONE DEVELOPMENT group, select Developer Profile.
Click Export Developer Profile.
Name the file, select a location for it, enter a password to secure the file, and click Save.
Now, when you need to develop iOS applications on another computer, import your digital-identification items into it by performing these steps:
Copy the developer-profile archive to the second computer.
On the second computer, launch Xcode.
Open the Organizer.
In the IPHONE DEVELOPMENT group, select Developer Profile.
Click Import Developer Profile.
Locate the archive, enter the password used to secure it, and click Open.
关键的一点就是不是直接从keychain里导出.cer文件,而是利用Xcode的organizer的IPHONE DEVELOPMENT ---》Developer Profile里自带的Export和Import操作,不知这个方法如果实用与三个或者10个电脑其不是很BUG
UIButton上的图片和文字位置调整:
属性: imageEdgeInsets
contentEdgeInsets
UIEdgeInsetsMake
Creates an edge inset for a button or view.
UIEdgeInsets UIEdgeInsetsMake (
CGFloat top,
CGFloat left,
CGFloat bottom,
CGFloat right
);
Parameters
top
The inset at the top of an object. 距离顶部的间隔
left
The inset on the left of an object 距离左边的间隔
bottom
The inset on the bottom of an object. 距离底部的间隔
right
The inset on the right of an object. 距离右边的间隔
https://www.evernote.com/shard/s20/sh/54fbd735-53b6-4436-9bd4-88d46b628527/22bc221c73b55dbf1ddfb5515649c239
1. GCD 使用后不用程序去管理线程的开闭,GCD会在系统层面上去动态检测系统状态,开闭线程
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (__block int i = 0; i<10000; i++) {
dispatch_async(aQueue, ^{
NSLog(@"%d",i);
});
}2011-07-05 17:11:38.346 ttt[41418:1803] 61
2011-07-05 17:11:38.346 ttt[41418:5f03] 1292
2011-07-05 17:11:38.348 ttt[41418:1803] 4096
2011-07-05 17:11:38.348 ttt[41418:5f03] 4954
2011-07-05 17:11:38.349 ttt[41418:1803] 5823
2011-07-05 17:11:38.349 ttt[41418:5f03] 6159
2011-07-05 17:11:38.349 ttt[41418:1803] 6575
2011-07-05 17:11:38.349 ttt[41418:5f03] 6634
2011-07-05 17:11:38.350 ttt[41418:1803] 7936
2011-07-05 17:11:38.350 ttt[41418:5f03] 8428
2011-07-05 17:11:38.351 ttt[41418:1803] 8895
2011-07-05 17:11:38.351 ttt[41418:5f03] 9364
2011-07-05 17:11:38.351 ttt[41418:1803] 9836
2011-07-05 17:11:38.351 ttt[41418:5f03] 10000
2011-07-05 17:11:38.354 ttt[41418:1803] 10000dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (int i = 0; i<1000; i++) {
dispatch_async(aQueue, ^{
NSLog(@"%d",i);
});
}2011-07-05 17:15:37.525 ttt[41697:1803] 0
2011-07-05 17:15:37.526 ttt[41697:1803] 2
2011-07-05 17:15:37.527 ttt[41697:1803] 3
2011-07-05 17:15:37.527 ttt[41697:1803] 4
2011-07-05 17:15:37.527 ttt[41697:1803] 5
2011-07-05 17:15:37.527 ttt[41697:1803] 6
2011-07-05 17:15:37.526 ttt[41697:5f03] 1
2011-07-05 17:15:37.530 ttt[41697:5f03] 8
2011-07-05 17:15:37.530 ttt[41697:5f03] 9
2011-07-05 17:15:37.530 ttt[41697:5f03] 10
2011-07-05 17:15:37.530 ttt[41697:5f03] 11
2011-07-05 17:15:37.532 ttt[41697:6203] 13void myFinalizerFunction(){
NSLog(@"xxx");
}
- (void)viewDidLoad {
[superviewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_set_context(queue, @"xxx");
dispatch_set_finalizer_f(queue, &myFinalizerFunction);
for (int i = 0; i<1000; i++) {
dispatch_async(queue, ^{
NSLog(@"%d",i);
});
}
dispatch_release(queue);dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_set_context(queue, @"xxx");
dispatch_set_finalizer_f(queue, &myFinalizerFunction);
for (int i = 0; i<10; i++) {
dispatch_async(queue, ^{
NSLog(@"%d",i);
});
}
NSLog(@"waiting");
dispatch_sync(queue, ^{
NSLog(@"wait done");
});
dispatch_release(queue);2011-07-05 17:54:35.479 ttt[44203:207] waiting
2011-07-05 17:54:35.479 ttt[44203:1803] 0
2011-07-05 17:54:35.481 ttt[44203:1803] 1
2011-07-05 17:54:35.482 ttt[44203:1803] 2
2011-07-05 17:54:35.482 ttt[44203:1803] 3
2011-07-05 17:54:35.483 ttt[44203:1803] 4
2011-07-05 17:54:35.483 ttt[44203:1803] 5
2011-07-05 17:54:35.484 ttt[44203:1803] 6
2011-07-05 17:54:35.484 ttt[44203:1803] 7
2011-07-05 17:54:35.485 ttt[44203:1803] 8
2011-07-05 17:54:35.485 ttt[44203:1803] 9
2011-07-05 17:54:35.486 ttt[44203:207] wait done
2011-07-05 17:54:35.487 ttt[44203:1803] xxxdispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// Add a task to the group
dispatch_group_async(group, queue, ^{
NSLog(@"first task");
});
dispatch_queue_t otherqueue = dispatch_queue_create("com.example.MyQueue", NULL);
for (int i = 0; i<100; i++) {
dispatch_group_async(group, otherqueue, ^{
NSLog(@"otherqueue task");
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"end waiting");
2011-07-05 19:32:31.919 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.919 ttt[50138:1803] first task
2011-07-05 19:32:31.922 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.923 ttt[50138:5f03] otherqueue task
...
2011-07-05 19:32:32.078 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.079 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.080 ttt[50138:207] end waitingvoid SaveArrayAsync(CFArrayRef array) { CFRetain(array); dispatch_queue_t queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ SaveToDisk(array); CFRelease(array); } }
// inside your controller's tableView:cellForRowAtIndexPath: cell = [[MyCell alloc] initWithBlock:^(MyCell* cell) { [self adjustCell:cell]; }];
// inside your controller's tableView:cellForRowAtIndexPath: __block me = self; cell = [[MyCell alloc] initWithBlock:^(MyCell* cell) { [me adjustCell:cell]; }];
Since the self doesn’t get retained this time, we avoid the retain cycle. While it strikes me as iffy, it does work, and it’s the only way I’ve found to deal with this situation. You can’t simply avoid copying the block if you want to call it later, because the scope will be gone by the time the function that declared the block exits. That will lead to nothing but sadness.