iOS开发随笔

1、统一类前缀

  类的前缀,可以这样加点击 target,在XCode最右侧的栏目里面会看到如下界面,在箭头处填写即可

  

 2、storyboard设置view的宽高比

  假如要设置View的宽高比为2:1
  (1)先将view的frame调整为2:1,比如width=200,height=100;
  (2)勾选Aspect Ratio

3、storyboard中控件的约束线也能拖拽成属性,方便代码修改!

4、类别(Category)和扩展(Extension)

  类别是类方法的扩展,不能添加属性!但是可以通过runtime进行添加

  扩展就是在类中声明属性@property

5、线程的死锁和互斥

  死锁:线程相互等待 例如: 同步主线程刷新!

  互斥:多线程并行修改同一个资源 例如:卖票等!

6、weak修饰属性时:当改属性的引用计数为0时,会将指针指向nil,底层实现就是hash表http://www.bijishequ.com/detail/314557?p=

7、ARC下OF(Core Foundation例如Core Graphics、Core Text)和OC对象的转换需要用到__bridge,__bridge_transfer,__bridge_retained

8、获取请求时间 

   CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();

  NSLog(@"link in time %f",end - start)

9、Xcode 8.1或更高版本,在使用Editor中的Create NSManagedObject Subclass 这个命令的时候,需要先把这个model的Codegen设置为Manual/None,否则会报错,

10、修改文件为 可执行: chmod +x 文件  ,先cd 到上一级文件夹;

11、AFN默认对请求参数(NSMutableDictionary)内字段进行UTF-8编码,直接发送字符串不行!

12、iOS6.0之后废弃ViewDidUnload方法! 

13、KVO的实现是isa混写(isa-swizzling),创建新类并重新set方法,将isa指针指向这个新类!

14、判断当前是iPhone几:

    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

15、 正弦波

y=峰高* sin(x * M_PI / self.frame.size.width * 峰的数量 + 移动速度)

16、touchBegin失效

  创建UIScrollView 或 UIImageView 时,当点击时UIScrollView 或 UIImageView 会截获touch事件,导致touchesBegan: withEvent:/touchesMoved: withEvent:/touchesEnded: withEvent: 等方法不执行。解决办法:当UIScrollView 或 UIImageView 截获touch事件后,让其传递下去即可(就是传递给其父视图UIView)

17、延迟函数的使用和取消(适用于多次点击同一个事件,弹框延迟消失)

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;//延迟函数
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;//取消延迟

18、bounds的影响(CAScrollLayer就是通过改变自己的原点位置,影响子view的显示)

(1)它可以修改自己坐标系的原点位置,影响“子view”的显示位置。
(2) bounds,它可以通过改变宽高,改变自身的frame,进而影响到再父视图的显示位置(平均扩充或缩减四周的区域)和大小。

19、开发者团队

  •   苹果提供了Agent、Admin、Member、No Access四种团队身份,它们分别拥有不同的权限。
  •   Agent:代理人。这个账号就是创建团队的账号,它拥有最大权限,且不会允许其他Admin修改Agent权限。但是Agent账号可以将权限转移。 
  •   Admin:管理员。它拥有几乎所有内容的管理权限 
  •   Member:成员。有权访问、下载一些信息,但是不能进行修改、管理 
  •   No Access:无权限。(因为后台有iOS、Mac、Safari三个模块,因此每个模块可以限定是否可以访问)

20、开发者账号

1>.个人账号
①费用:99 美元/年
②协作人数:仅限开发者自己
③不需要填写公司的邓百氏编码( D-U-N-S Number)
④支持账号下的 app 上线 App Store
⑤需要创建 Apple ID
2>.公司账号
① 费用:99 美元/年
② 允许多个开发者协作开发
③ 需要填写公司的邓百氏编码( D-U-N-S Number)
④ 该账号下的 app 可上线至 App Store
⑤ 需要创建 Apple ID
3>.企业账号
① 费用:299 美元/年
② 允许多个开发者协作开发
③ 需要填写公司的邓百氏编码( D-U-N-S Number)
④ 该账号下的 app 不能发布到 App Store 中
⑤ 需要创建 Apple ID
 
21、PCH文件的创建
  1)新建New File -->>(iOS)Other 中的PCH File文件;
  2)Build Settings -->> Apple LLVM 9.0 - Language --->>Prefix Header 设置PCH文件路径(拖动就行);
 
22、swift和Oc混编桥接文件
  1) 在OC工程中创建swift文件是会提示时候自动创建桥接文件
  2)自己手动创建桥接文件(前提示工程中有swift文件)
    新建New File -->> (iOS)Source 的Header File 文件
    Build Settings -->>Switf Compiler - Generl -->>Objective-C Bridging Header 设置桥接文件路径(项目名/项目名-Bridging-Header.h 桥接文件一般格式)
  注意:OC工程使用swift文件需要导入 #import "工程名-Swift.h"头文件;Swift工程使用OC文件需要在桥接文件到人OC头文件即可!
 
23、判断版本号
if (@available(iOS 8.2, *)) {
      //iOS 8.2版本之后
} else {
      
}

24、精简代码,返回最后一句的值

    self.backScrollView.frame = ({
        CGRect frame = self.backScrollView.frame;
        frame.origin.y = self.view.frame.origin.y - 10;
        frame;
    });

 25、子视图自适应父视图

@property(nonatomic) BOOL               autoresizesSubviews; // default is YES. 
@property(nonatomic) UIViewAutoresizing autoresizingMask;

 26、获取字符串中的数字

    NSCharacterSet* nonDigits =[[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    int remainSecond =[[urlString stringByTrimmingCharactersInSet:nonDigits] intValue];
    NSLog(@" num %d ",remainSecond);

 27、Objective-C Literals 字面量创建

NSArray *array = @[@"One String", @"Two"];

28、创建Category分类

1、文件列表右键-->选择New File...
2、选择iOS-->Source -->Objective-C File
3、File:文件起名
   File Type:文件类型Empty File(空文件)、Category(分类)、Protocol(协议)、Extension(扩展)
  Class:类名

 29、三目运算符

rootID ?rootID: @""  和 rootID ?: @"" 效果等同

 30、gem sources 淘宝不在维护

https://gems.ruby-china.org/

31、超出view部分拥有点击事件,重写view的hitTest withEvent事件

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil) {
        for (UIView *subView in self.subviews) {
            CGPoint tp = [subView convertPoint:point fromView:self];
            if (CGRectContainsPoint(subView.bounds, tp)) {
                view = subView;
            }
        }
    }
    return view;
}

 

 

posted @ 2017-02-16 16:38  ForeverGuard  阅读(273)  评论(0编辑  收藏  举报