iOS---小经验分享

1.字符串在block中得赋值

  • 定义一个全局变量,《字符串》当这个字符串用copy修饰的时候,然后再在block中赋值,当在block块之外访问时,不能得到字符创的值。此时字符串应该设置为strong。

  • 在block中修改局部变量的值 此变量需要用__block修饰

1.字符串在block中得赋值

  • 定义一个全局变量,《字符串》当这个字符串用copy修饰的时候,然后再在block中赋值,当在block块之外访问时,不能得到字符串的值,此时的字符串可能已经被释放,解决办法字符串应该用strong修饰。
@interface ()
/** 字符串 */
@property (strong, nonatomic) NSString *string;
@end

 void (^test)(void) = ^ {
        self.string = @"string";
    };
 NSLog(@"%@",self.string);
  • 在block中修改局部变量的值 此变量需要用__block修饰
    __block NSString *str = nil;
    void (^test)(void) = ^ {
        str = @"string";
    };
   NSLog(@"%@",str);

2.xib--当一个视图是通过xib创建时,且使用自动布局--autolayout,那么当把xib,添加到其他视图中得时候,会得到意想不到的结果。

  • 解决办法:取消autoresizingMask

且通过xib创建的视图,self.view.bounds 不是屏幕那个尺寸

- (void)awakeFromNib
{
    self.autoresizingMask = UIViewAutoresizingNone;
}
  • 当控制器的view是通过xib或者stroyBoard加载的时候,那么把scrollView加到控制器的view上时,尺寸设置self.view.bounds;会被拉伸,若不被拉伸用以下语句
    scrollView.frame = self.view.bounds;
    scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

3.集成通讯录UI,然后跳转到发短信界面

  • Remote compose controller timed out (NO)! On Opening MFMessageComposer

  • Meaning of Warning “while a presentation is in progress!”

  • 在带有UI的通讯录上然后选择联系人,让他跳转到发短信界面,不合理跳转会爆以上那两个警告。而且不会跳转到发短信界面

// 代理方法
#pragma mark - <ABPeoplePickerNavigationControllerDelegate>
/**
 *  当选择某一个联系人的时候就会执行该方法
 *
 *  @param person       每一个联系人就是一条记录
 */
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{

    // 1.获取对应联系人的电话号码
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFIndex phoneCount = ABMultiValueGetCount(phones);
    NSString *phoneValue;
    for (CFIndex i = 0; i < phoneCount; i++) {
        phoneValue = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phones, i);
    }

    // 2.发短信
    dispatch_async(dispatch_get_main_queue(), ^{
         // 3.发短息
    // 3.1.显示发短息的控制器
    MFMessageComposeViewController *messageComposeVC = [[MFMessageComposeViewController alloc] init];
    // 3.2.设置内容
    messageComposeVC.body = self.msgString;

    // 3.3.设置代理
    messageComposeVC.messageComposeDelegate = self;

    // 3.4.设置收件人
    messageComposeVC.recipients = @[phoneValue];

    // 3.5.显示控制器
    [self presentViewController:messageComposeVC animated:NO completion:nil];

    });

    // 3.释放应该释放对象
    CFRelease(phones);
#warning 是否有内存泄露
    CFRelease((__bridge CFTypeRef)(phoneValue));
}
  • 首先这个通讯录VC是从self --modal出的控制器。当调用这个代理方法之后,通讯录VC就会销毁。,所以应该开个子线程在modal出发短信的控制器。

还待补充。。。。

posted @ 2015-10-06 22:43  ShaoYL  阅读(284)  评论(0编辑  收藏  举报