ios基础_ios 基础 - CSDN
  • 一.iOS开发之loadView、viewDidLoad及viewDidUnload的关系 1.第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view2.view创建完毕后会调用viewDidLoad方法进行界面元素的初始化3.当...

    一.iOS开发之loadViewviewDidLoadviewDidUnload的关系 

    1.第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view

    2.view创建完毕后会调用viewDidLoad方法进行界面元素的初始化

    3.当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法

    4.当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view

    5.view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化


    二.load和initialize的区别

    1. @implementation Person  
    2. // 只要程序启动就会将所有类的代码加载到内存中, 放到代码区(无论该类有没有被使用到都会被调用)  
    3. // load方法会在当前类被加载到内存的时候调用, 有且仅会调用一次  
    4. // 如果存在继承关系, 会先调用父类的load方法, 再调用子类的load方法  
    5. + (void)load  
    6. {  
    7.     NSLog(@"Person类被加载到内存了");  
    8. }  
    9.   
    10. // 当当前类第一次被使用的时候就会调用(创建类对象的时候)  
    11. // initialize方法在整个程序的运行过程中只会被调用一次, 无论你使用多少次这个类都只会调用一次  
    12. // initialize用于对某一个类进行一次性的初始化  
    13. // initialize和load一样, 如果存在继承关系, 会先调用父类的initialize再调用子类的initialize  
    14. + (void)initialize  
    15. {  
    16.     NSLog(@"Person initialize");  
    17. }  
    18.   
    19. @end  

    1、+load方法当类或分类添加到object-c runtime时被调用,子类的+load方法会在它所有父类的+load方法之后执行,而分类的+load方法会在它的主类的+load方法之后执行。但不同的类之间的+load方法的调用顺序是不确定的,所以不要在此方法中用另一个类。

    2、+load方法不像普通方法一样,它不遵循那套继承规则。如果某个类本身没有实现+load方法,那么不管其它各级超类是否实现此方法,系统都不会调用。+load方法调用顺序是:SuperClass -->SubClass --> CategaryClass。

    3、+initialize是在类或者它的子类接受第一条消息前被调用,但是在它的超类接收到initialize之后。也就是说+initialize是以懒加载的方式被调用的,如果程序一直没有给某个类或它的子类发送消息,那么这个类的+initialize方法是不会被调用的。

    4、+initialize方法和+load方法还有个区别,就是运行期系统完整度上来讲,此时可以安全使用并调用任意类中的任意方法。而且,运行期系统也能确保+initialize方法一定会在“线程安全的环境”中执行,这就是说,只有执行+initialize的那个线程可以操作类或类实例,其他线程都要阻塞等着+initialize执行完。

    5、+initialize方法和其他类一样,如果某个类未实现它,而其超类实现了,那么就会运行超类的实现代码。如果本身和超类都没有实现,超类的分类实现了,就会去调用分类的initialize方法。如果本身没有实现,超类和父类的分类实现了就会去调分类的initialize方法。不管是在超类中还是分类中实现initialize方法都会被调多次,调用顺序是SuperClass -->SubClass。            

    三. UIWindow使用

    1) 同一层级的 最后一个显示出来,上一个被覆盖

    2)UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面。

    3)谁最后设置的 makeKeyAndVisible 谁就是keyWindow 其他的也会显示出来 所有的window都可以监听键盘 和点击的事件 

     

    UIView的功能 

    负责渲染区域的内容,并且响应该区域内发生的触摸事件

    UIWindow

    在iOS App中,UIWindow是最顶层的界面内容,我们使用UIWindow和UIView来呈现界面。UIWindow并不包含任何默认的内容,但是它被当作UIView的容器,用于放置应用中所有的UIView。

    从继承关系来看,UIWindow继承自UIView,所以UIWindow除了具有UIView的所有功能之外,还增加了一些特有的属性和方法,而我们最常用的方法,就是在App刚启动时,调用UIWindow的rootViewController(必须指定根控制器) 和 makeKeyAndVisible方法

    状态栏和键盘都是特殊的UIWindow。

     

    UIWindow的主要作用有

    1.作为UIView的最顶层容器,包含应用显示所有的UIView;

    2.传递触摸消息和键盘事件给UIView;

     

    UIWindow的层级:

    UIWindow的层级由一个UIWindowLevel类型属性windowLevel,该属性指示了UIWindow的层级,windowLevel有三种可取值。

    并且层级是可以做加减的self.window.windowLevel = UIWindowLevelAlert+1;

    Normal ,StatusBar,Alert.输出他们三个层级的值,我们发现从左到右依次是0,1000,2000,也就是说Normal级别是最低的,StatusBar处于中级,Alert级别最高。而通常我们的程序的界面都是处于Normal这个级别的,系统顶部的状态栏应该是处于StatusBar级别,提醒用户等操作位于Alert级别。根据window显示级别优先原则,级别高的会显示在最上层,级别低的在下面,我们程序正常显示的view在最底层;

    四.NS_ENUM & NS_OPTIONS

    从枚举定义来看,NS_ENUM和NS_OPTIONS本质是一样的,仅仅从字面上来区分其用途。NS_ENUM是通用情况,NS_OPTIONS一般用来定义具有位移操作或特点的情况(bitmask)。

    五. 在任意页面,隐藏其他页面的键盘

        1.当前viewController隐藏本页面的键盘

        很容易。直接调用 [textfield resignFirstResponder]即可。

        2.目前前遇到一个需求

         ControllerA出来时候,隐藏当前top 任意view的键盘。那么可以使用这个

    [objc] view plain copy
    1. [[[UIApplication sharedApplication] keyWindow] endEditing:YES];  
    这是有根据的,OC sdk中有一个UIView的类别,就是endEditing。可以参考UITextField.h的头文件

    [objc] view plain copy
    1. @interface UIView (UITextField)  
    2. - (BOOL)endEditing:(BOOL)force;    // use to make the view or any subview that is the first responder resign (optionally force)  
    3. @end  

    3.如果不方便获取当前view

        可以使用该方法

    [objc] view plain copy
    1. [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponser) to:nil from:nil forEvent:nil];  

    六.isKindOfClass和isMemberOfClass的区别

    isKindOfClass和isMemberOfClass 都是NSObject的比较Class的方法

      但两个有很大区别:
      isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员
      isMemberOfClass只能确定一个对象是否是当前类的成员
      例如:我们已经成NSObject派生了自己的类,isMemberOfClass不能检测任何的类都是基于NSObject类这一事实,而isKindOfClass可以。
      [[NSMutableData data] isKindOfClass:[NSData class]]; // YES [[NSMutableData data] isMemberOfClass:[NSData class]]; // NO


    七.NSString属性什么时候用copy,什么时候用strong

    由于NSMutableString是NSString的子类,所以一个NSString指针可以指向NSMutableString对象,让我们的strongString指针指向一个可变字符串是OK的。

    而上面的例子可以看出,当源字符串是NSString时,由于字符串是不可变的,所以,不管是strong还是copy属性的对象,都是指向源对象,copy操作只是做了次浅拷贝。

    当源字符串是NSMutableString时,strong属性只是增加了源字符串的引用计数,而copy属性则是对源字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。

    这里还有一个性能问题,即在源字符串是NSMutableString,strong是单纯的增加对象的引用计数,而copy操作是执行了一次深拷贝,所以性能上会有所差异。而如果源字符串是NSString时,则没有这个问题。

    所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,我们建议用copy,以免因可变字符串的修改导致的一些非预期问题。


    八.NSArray 各种遍历方式

     编程中经常需要遍历collection元素,做法有标准的for循环,OC1.0的NSEnumerator和OC2.0的fast NSEnumerator。语言引入“块”这一特性后,又多出来几种新的遍历方式。

        for循环大家很熟悉,很简单。但是遍历字典和set的时候就稍麻烦,for循环有一个优势,可以反向遍历。在删除数组中一个元素的时候采用反向遍历

        OC 1.0的NSEnumerator是个抽象基类,定义了两个方法,供具体的子类实现

    [objc] view plain copy
    1. -(NSArray*) allObjects;  
    2. -(id) nextObject;  

        举例,遍历数字

    [objc] view plain copy
    1. NSArray *anArray=/*....*/;  
    2. NSEnumerator *enumerator = [anArray objectEnumerator];  
    3. id object;  
    4. while((object = [enumerator nextObject]) != nil){  
    5.     //do something   
    6. }  

    快速遍历,就是for-in语句

    直接上代码,这种办法比上面两种都高效,安全,简单,强烈推荐!在删除数组元素的时候,同样可以反序执行。

    [objc] view plain copy
    1. NSArray *anArray=/*...*/;  
    2. for (id object in anArray){  
    3.     //do something   
    4. }  
    5. //dictionary  
    6. NSDictionary* dic = /*...*/;  
    7. for(id key in dic){  
    8.     id value = dic[key];  
    9.     //do something   
    10. }  
    11. //set  
    12. NSSet *aSet = /*...*/;  
    13. for (id object in aSet){  
    14.     //do something   
    15. }  
    16. //反向遍历  
    17. NSArray *anArray=/*...*/;  
    18. for (id object in [anArray reverseObjectEnumerator]){  
    19.     //do something   
    20. }  

    基于块的变量方式

        当前OC中,最新引入的一种做法句ishi基于块来遍历。这种做法比前三种效率都高,但是代码量比for-in多。

    [objc] view plain copy
    1. NSArray *anArray=/*...*/;  
    2. [anArray enumerateObjectUsingBlock]:  
    3.     ^(id object,NSUInter idx,BOOLBOOL *stop){  
    4.         // do something  
    5.         if(shouldStop){  
    6.             *stop = yes;  
    7.         }  
    8.     }];  
    其他collection类似

    九.NSLog 格式化输出数据

    %@     对象

    %d, %i 整数

    %u     无符整形

    %f     浮点/双字

    %x, %X 二进制整数

    %o     八进制整数

    %zu    size_t

    %p     指针

    %e     浮点/双字 (科学计算)

    %g     浮点/双字

    %s     C 字符串

    %.*s   Pascal字符串

    %c     字符

    %C     unichar

    %lld   64位长整数(long long)

    %llu   无符64位长整数

    %Lf    64位双字

    %e 是实数,用科学计数法计的


    十.iOS 中几种常用的锁总结

    多线程编程中,应该尽量避免资源在线程之间共享,以减少线程间的相互作用。 但是总是有多个线程相互干扰的情况(如多个线程访问一个资源)。在线程必须交互的情况下,就需要一些同步工具,来确保当它们交互的时候是安全的。

    锁是线程编程同步工具的基础。iOS开发中常用的锁有如下几种:

    1. @synchronized
    2. NSLock 对象锁
    3. NSRecursiveLock 递归锁
    4. NSConditionLock 条件锁
    5. pthread_mutex 互斥锁(C语言)
    6. dispatch_semaphore 信号量实现加锁(GCD)
    7. OSSpinLock (暂不建议使用,原因参见这里
    链接:https://www.jianshu.com/p/1e59f0970bf5

    十一.内存泄露

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的一个无形杀手是——循环引用。循环引用可以简单理解为A引用了B,而B又引用了A,双方都同时保持对方的一个引用,导致任何时候引用计数都不为0,始终无法释放。若当前对象是一个ViewController,则在dismiss或者pop之后其dealloc无法被调用,在频繁的push或者present之后内存暴增,然后APP就duang地挂了。下面列举我们变成中比较容易碰到的三种循环引用的情形。

    (1)计时器NSTimer

    一方面,NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用。 另一方面,若timer一直处于validate的状态,则其引用计数将始终大于0。先看一段NSTimer使用的例子(ARC模式):

    1 #import <Foundation/Foundation.h>
    2 @interface Friend : NSObject
    3 - (void)cleanTimer;
    4 @end
    复制代码
     1 #import "Friend.h"
     2 @interface Friend ()
     3 {
     4     NSTimer *_timer;
     5 }
     6 @end
     7 
     8 @implementation Friend
     9 - (id)init
    10 {
    11     if (self = [super init]) {
    12         _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(handleTimer:)
    13                                                 userInfo:nil repeats:YES];
    14     }
    15     return  self;
    16 }
    17 
    18 - (void)handleTimer:(id)sender
    19 {
    20     NSLog(@"%@ say: Hi!", [self class]);
    21 }
    22 - (void)cleanTimer
    23 {
    24     [_timer invalidate];
    25     _timer = nil;
    26 }
    27 - (void)dealloc
    28 {
    29     [self cleanTimer];
    30     NSLog(@"[Friend class] is dealloced");
    31 }
    复制代码

    在类外部初始化一个Friend对象,并延迟5秒后将friend释放(外部运行在非arc环境下)

    复制代码
    1         Friend *f = [[Friend alloc] init];
    2         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    4             [f release];
    5         });
    复制代码

    我们所期待的结果是,初始化5秒后,f对象被release,f的dealloc方法被调用,在dealloc里面timer失效,对象被析构。但结果却是如此:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    2015-03-18 18:00:35.300 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:36.299 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:37.300 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:38.299 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:39.299 WZLCodeLibrary[41422:3390529] Friend say: Hi!//运行了5次后没按照预想的停下来
    2015-03-18 18:00:40.299 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:41.300 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:42.300 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:43.299 WZLCodeLibrary[41422:3390529] Friend say: Hi!
    2015-03-18 18:00:44.300 WZLCodeLibrary[41422:3390529] Friend say: Hi!<br>.......根本停不下来.....

    这是为什么呢?主要是因为从timer的角度,timer认为调用方(Friend对象)被析构时会进入dealloc,在dealloc可以顺便将timer的计时停掉并且释放内存;但是从Friend的角度,他认为timer不停止计时不析构,那我永远没机会进入dealloc。循环引用,互相等待,子子孙孙无穷尽也。问题的症结在于-(void)cleanTimer函数的调用时机不对,显然不能想当然地放在调用者的dealloc中。一个比较好的解决方法是开放这个函数,让Friend的调用者显式地调用来清理现场。如下:

    1
    2
    3
    4
    5
    Friend *f = [[Friend alloc] init];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [f cleanTimer];
        [f release];
    });

    =======================================

    (2)block

    block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC)。在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};block的这种循环引用会被编译器捕捉到并及时提醒。举例如下,依旧以Friend类为例子:

    复制代码
    #import "Friend.h"
    
    @interface Friend ()
    @property (nonatomic) NSArray *arr;
    @end
    
    @implementation Friend
    - (id)init
    {
        if (self = [super init]) {
             self.arr = @[@111, @222, @333];
            self.block = ^(NSString *name){
                NSLog(@"arr:%@", self.arr);
            };
        }
        return  self;
    }
    复制代码

    我们看到,在block的实现内部又使用了Friend类的arr属性,xcode给出了warning, 运行程序之后也证明了Friend对象无法被析构:

    网上大部分帖子都表述为"block里面引用了self导致循环引用",但事实真的是如此吗?我表示怀疑,其实这种说法是不严谨的,不一定要显式地出现"self"字眼才会引起循环引用。我们改一下代码,不通过属性self.arr去访问arr变量,而是通过实例变量_arr去访问,如下:

    由此我们知道了,即使在你的block代码中没有显式地出现"self",也会出现循环引用!只要你在block里用到了self所拥有的东西!但对于这种情况,我们无法通过加__weak声明或者__block声明去禁止block对self进行强引用或者强制增加引用计数。但我们可以通过其他指针来避免循环引用(多谢xq_120的提醒),具体是这么做的:

     

    1
    2
    3
    4
    5
    __weak typeof(self) weakSelf = self;
    self.blkA = ^{
    __strong typeof(weakSelf) strongSelf = weakSelf;//加一下强引用,避免weakSelf被释放掉
    NSLog(@"%@", strongSelf->_xxView); //不会导致循环引用.
    };

     

     

    对于self.arr的情况,我们要分两种环境去解决:

    1)ARC环境下:ARC环境下可以通过使用_weak声明一个代替self的新变量代替原先的self,我们可以命名为weakSelf。通过这种方式告诉block,不要在block内部对self进行强制strong引用:(如果要兼容ios4.3,则用__unsafe_unretained代替__weak,不过目前基本不需考虑这么low的版本)

    复制代码
    1          self.arr = @[@111, @222, @333];
    2         __weak typeof(self) weakSelf=self;
    3         self.block = ^(NSString *name){
    4             NSLog(@"arr:%@", weakSelf.arr);
    5         };
    复制代码

    2)MRC环境下:解决方式与上述基本一致,只不过将__weak关键字换成__block即可,这样的意思是告诉block:小子,不要在内部对self进行retain了!

     

    =========================================================

    (3)委托delegate

    在委托问题上出现循环引用问题已经是老生常谈了,本文也不再细讲,规避该问题的杀手锏也是简单到哭,一字诀:声明delegate时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong,毕竟这基本逃不掉循环引用了!



    展开全文
  • IOS基础

    2020-04-28 20:10:40
    IOS基础 一·类的成员变量和属性 1.成员属性 1.特点:成员属性是公共的用于暴露给其他的类访问,因为类会帮它自动创建get,set方法。 2.成员属性放在.h文件内,使用方法如下: //声明 @property(nonatomic,strong)...

    IOS基础

    http://www.cocoachina.com
    https://gsl201600.github.io/page/8/

    一·类的成员变量和属性

    Swift学习文档
    1.成员属性
    1.特点:成员属性是公共的用于暴露给其他的类访问,因为类会帮它自动创建get,set方法。
    2.成员属性放在.h文件内,使用方法如下:

    //声明
    @property(nonatomic,strong)NSString *name;
    //nonatomic允许多线程同时访问,但是不能保证线程安全,性能高
    //atomic不允许多线程同时访问,但是能保证线程安全,性能低
    //strong是强引用,
    //copy
    //weak
    //assign//如引用,用于修饰基本类型
    

    3.案例展示
    在这里插入图片描述
    2.成员变量
    1.特点:成员变量是私有的其他类不能访问,只有通过get和set方法才可以对成员属性进行操作。
    2.成员属性放在.m文件内,使用方法如下

    //声明
    @interface 类名()
    {
     		NSString *name;//成员变量
    }
    //set和get方法
    -(void)setName:(NSString *)name{
    			this.name=name;
    }
    -(NSString *)name{
     return name;
    }
    

    3.案例展示
    在这里插入图片描述

    二·类的成员方法(函数)

    1.类的成员方法
    1.使用
    ①无参数,无返回值方法
    1.需要在.h文件声明

    -(void)functionName;
    

    案例
    在这里插入图片描述
    3.在.m文件内实现

    -(void)functionName{
    }
    

    案例
    在这里插入图片描述

    ②有参数,无返回值方法
    1.声明

    -(void)functionName:(参数数据类型)参数名;
    

    案例
    在这里插入图片描述
    3.实现

    -(void)functionName:(参数类型)参数名{
    }
    

    案例
    在这里插入图片描述
    ③无参数,有返回值
    1.声明

    -(NSString)function;
    

    2.实现
    -(NSString)function{
    }
    案例
    在这里插入图片描述
    ④.类方法的调用
    类的声明

    Persion *persion=[[Persion alloc]init];
    

    调用方法

    [persion functionName]
    

    案例
    在这里插入图片描述
    ⑤构造方法
    1.功能
    构造函数主要用于初始化操作,在类被创建的时候被调用
    2.构造函数的使用

    -(instancetype)init
    {
     	self=[super init];
     	if(self)
     	{
     		NSLog(@"我是构造函数");
     	}
    }
    

    案例
    在这里插入图片描述
    ⑥析构方法
    1.功能
    主要用于类使用完之后的空间释放(现在已经不需要手动去释放空间了),在类被释放掉的时候调用析构函数
    2.使用

    -(void)dealloc{
    }
    

    案例
    在这里插入图片描述
    ⑦实例方法和类的方法
    1.实例方法介绍
    实例方法是类被实例化后实例调用的方法
    2.声明

    -(void)function;
    

    案例
    在这里插入图片描述
    3.类的方法介绍
    类的方法是直接用类名调用的方法,不需要实例化(和JAVA静态方法有点相似)
    4.声明

    +(void)function;
    

    案例
    在这里插入图片描述

    5.实现

    +(void)function{
    }
    

    在这里插入图片描述

    三·类的关键字

    1.self关键字
    ①self关键字的介绍
    self代表的是调用者,在方法内部代表的是当前方法的实例。
    ②使用

    [self 本类的方法];
    

    案例
    在这里插入图片描述
    2.继承
    ①继承的介绍
    只要一个类继承了父类,他就拥有了成员暴露出来的所有成员变量和方法
    ②.使用
    在.h文件继承

    @interface 本类:父类
    

    案例
    在这里插入图片描述
    2.super关键字
    ①super关键字的介绍

    super是编译器指示符,仅仅是一个标志,并不是一个指针,是标志的当前对象去调用父类的方法,本质上还是当前对象调用,并不是让父类对像调用方法,调用者还是本身。

    ②使用

    [super fuctionName]//调用父类方法
    super.name //获得父类属性
    
    

    案例
    在这里插入图片描述

    四·字符串

    1.字符串的截取
    ①从头开始截取

    NSString *str=@"HeadCenterEnd";
    //重从头部截取4个字符
    NSString *tempStr=[str substringToIndex:4];
    //tempStr=Head
    

    ②从尾截取

    NSString *str=@"HeadCenterEnd";
    //重从尾部截取3个字符
    NSString *tempStr=[str substringFromIndex:str.length-3];
    //tempStr=End
    

    ③截取中间的一个区域的字符

    NSString *str=@"HeadCenterEnd";
    //创建一个区域对象
    NSRange range;
    range.location=4;//开始索引
    range.length=6;//截取的长度
    //重从尾部截取3个字符
    NSString *tempStr=[str substringWithRange:range];
    //tempStr=Center
    

    2.字符串的替换
    //①替换某一段字符

    NSString *str=@"HeadCenterEnd";
    NSRange range=NSMakeRange(4,6);//区域对象
    NSString *tempStr=[str stringByReplacingCharactersInRange:range withString@"Middle"];
    tempStr=@"HeadMiddleEnd";
    

    //②替换字符串中的字符

    NSString *str=@"AADDCC";
    NSString *tempStr=[str stringByReplacingOccurrencesOfString:@"DD" withString@"BB"];
    tempStr=@"AABBCC";
    

    3.分割字符串

    NSString *str=@"name:xiaoming;age:11;height:170";
    NSArray *tempArray=[str componentsSeparatedByString:@";"];
    //输出结果
    name:xiaoming,
    age:11,
    height:170
    

    4.字符串的拼接

    NSString *age=@"年龄";
    int mun=15;//基本类型不需要*
    NSString *temp=[NSString stringWithFormat:@"%@:%d",age,mun];//引用类型用@占位符
    //输出结果
    年龄:15
    

    五·数据类型

    1.数据类型

    int     1,2,3
    char   'a','b','c'
    array    {1,2,3}
    NSString   字符串引用类型
    NSInteger   int
    CGFloat    float
    NSRange   范围
    NSNumber   对象引用类型
    字典				
    Bool      YES or NO
    
    

    2.NSInteger

    NSInteger a;
    a=1;
    NSInteger b=2;
    

    3.CGFloat

    CGFloat b;
    b=2.3;
    CGFloat a=1.3;
    

    4.NSNumber

    //int
    int a=2;
    NSNumber *number=[NSNumber numberWithInteger :10];
    a+=number.integerValue;
    
    
    //float
    NSNumber *number=[NSNumber numberWithFloat:1.6];
    int c=0.4+number.floatValue;
    

    5.NSArray
    ①不可变数组

    NSArray *array=[[NSArray alloc]initWithObjects:@"a",@"b",@"c",nil];//创建并赋值
    NSArray *array2=[[NSArray alloc]initWithArray:array];//创建并赋一个数组
    NSArray *array3=[NSArray arrayWithArray:array];//使用类方法创建并赋值;
    NSArray *array4=[NSArray array];//使用类方法
    

    ②可变数组

    NSMutableArray *marray=[[NSMutableArray alloc]init];//使用构造方法创建
    NSMutableArray *marray2=[NSMutableArray arrayWithCapacity:100]//创建并设置大小
    NSMutableArray *marray3=[NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];//创建并初始化值
    NSMutableArray *marray4=[NSMutableArray alloc]initWithArray:array];//创建并赋值一个不可变数组
    

    ③操作可变数组

    NSArray *array=[[NSArray alloc]initWithObjects:@"a",@"b",@"c",nil];//创建并赋值
    NSMutableArray *marray=[[NSMutableArray alloc]init];//使用构造方法创建
    //添加一个对象
    [marray addObject:<对象>];
    //添加一个不可变数组
    [marray addObjectsFromArray:array];
    //删除指定对象
    [marray removeObject:@"a"];
    //删除最后一个对象
    [marray removeLastObject];
    //根据索引删除指定对象
    [marray removeObjectAtIndex:0];
    //删除所有对象
    [marray removeAllObjects];
    

    6.字典
    ①不可变字典

    NSDictionary *dic=[[NSDictionary alloc]init];//构造方法创建
    NSDictionary *dic=[NSDictionary dictionaryWithObject:@"value" forKey:@"key"];//类方法创建只有一对键值对的字典
    NSDictionary *dic=@{
    			@"name":@"xiaoming",
    			@"age":@"15"
    }//声明字典赋值
    NSDictionary *dic=[NSDictionary dictionaryWithDictionary:dic];//类方法创建并赋值一个不可变字典
    NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:@"name",@"xiaoming",@"age",@"11",nil];//类方法创建并赋值
    

    ②可变字典

    NSMutableDictionary *mdic=[[NSMutableDictionary alloc]init];//构造方法创建
    NSMutableDictionary *mdic=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"name",@"xiaoming",@"age",@"11",nil];//类方法创建并赋值
    NSMutableDictionary *mdic=[NSMutableDictionary dictionaryWithDictionary:mdic];
    

    ③可变数组的操作
    NSMutableDictionary *mdic=[[NSMutableDictionary alloc]init];
    //添加
    [dic setObject:@“xiaoming” forKey:@“name”];
    //修改
    [dic setObject:@“xiaofang” forKey:@“name”];
    //删除指定
    [dic removeObjectForKey:@“name”];
    //删除所有
    [dic removeAllObjects];
    //获得所有Key
    NSArray *keyArray= [dic allKeys];
    //遍历
    for(id key in dic)
    {
    NSLong(@“key:%@ value:%@”,key,[dic objectForKey]);
    }

    六·内存管理

    1.ARC(自动管理内存)
    现在使用的是ARC自动内存管理,不需要我们管理内存。
    2.MRC(手动管理内存)
    ①管理过程:
    核心:谁创建谁释放,用计数器判断。
    当我们调用alloc/new/copy/mutablecopy/retrain 会导致计数器加1(每加1就要占内存)。
    要通过release方法释放内存([object release]);
    ②原则
    自己生产的对象,自己持有。
    非自己产生的对象,自己也能持有。
    不在需要自己持有对象的时候,释放。
    非自己持有的对象无需释放

    六·Objective-c的语言特性

    1.类目(类别)
    ①类目的介绍
    类别(category)是Objective-C语言的新特性,为现在的类添加新方法的方式。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现,用类目就可以实现在没有类的源代码的条件下为类添加新的方法。
    通过类目加入的方法会成为原始类的部分。列如:通过类目为NSString添加方法,编译会把这些方法加入NSString的定义里;类目里定义的方法可以干任何原始类中方法能干的事,在运行时他们是平等对待的;类目里定义的方法也会被原始类的子类所继承,就跟原始类的其他方法一样。
    ②类目的局限性
    a,无法添加新的实例变量。
    b,若在类目中覆盖现有类的原有方法。这样会引起super消息的断裂,因为类目中的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法
    ③使用类目
    a.创建
    在这里插入图片描述
    b.生成的类
    在这里插入图片描述
    c.添加方法的声明
    在这里插入图片描述
    d.添加方法的实现
    在这里插入图片描述
    e.使用
    在这里插入图片描述
    2.延展
    ①简介
    延展Extension,是为类扩充私有的方法,以及私有的实例变量,和分类Category相比,延展定义的方法是有私有的,而且还可以定义实例变量(私有的)。
    ②使用
    以@interface开头+类名(哪一个类的延展)+小括号,小括号内填写的是延展名,一般情况下都省略。@end结束(写在.m文件里);
    ③案例
    在这里插入图片描述
    3.协议(相当于Java里面的interface)
    ①简介
    Protocol(协议)用来声明一些方法,或者说,Protocol是由一系列的方法声明组成的。一个类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明。
    一个Protocol只要遵守了其他Protocol,就相当于拥有了其他Protocol的所有方法声明。
    既然Protocol只能声明方法,那么方法的实现自然写在类的实现文档.m里面。
    ②使用
    @required
    -(void)xxx;
    @optional
    -(void)xxxx;
    @required之下的方法是必须实现的,不然编译器会发出报错;
    @optional之下的方法是可选实现的。
    ③案例
    a.创建Protocol
    在这里插入图片描述
    创建后会生成.h文件
    b.声明方法
    在这里插入图片描述
    c.遵守协议
    在这里插入图片描述
    d.实现方法
    在这里插入图片描述
    4.KVO(key-value-observer)
    ①简介
    KVO:当某个属性的值发生变化的时候,通知观察这,也就是说,当某一个对象的属性调用setter方法的时候,通知观察者,所以,KVO本质上其实是一个观察者模式。
    ②使用
    a.成员声明属性
    在这里插入图片描述
    b.创建实例
    在这里插入图片描述
    c.对实例属性进行监控
    在这里插入图片描述
    c.实现代理
    在这里插入图片描述
    4.KVC(key-value-coding)
    ①简介
    KVC:是一个基于NSKeyValueCoding非正式协议实现的机制,他可以直接通过key值对对象的属性进行存储操作,而且不需要通过调用明确的存取方法。这样就可以在运行时动态在访问和修改对象,而不是在编译时确定。
    KVC提供了一种间接访问属性方法成员变量的机制,可以通过字符串来访问对象的属性方法或成员变量。
    ②使用
    a.在.h文件里面声明成员属性

    在这里插入图片描述
    b.声明对象
    在这里插入图片描述
    c.对属性进行赋值
    在这里插入图片描述
    d.获得值
    在这里插入图片描述
    c.多级赋值
    在这里插入图片描述
    d.多级获得值
    在这里插入图片描述
    5.单例
    ①简介
    简单的来说,一个单例类,在整个过程中只有一个实例,并且提供一个类方法共全局调用,在编译时初始这个类,然后一直保存在内存中,直到退出时由系统自动释放这部分内存。
    ②使用
    a.第一步(必不可少的)

    + (instancetype)sharedSingleton {
        static Singleton *_sharedSingleton = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //不能再使用alloc方法
            //因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
            _sharedSingleton = [[super allocWithZone:NULL] init];
        });
        return _sharedSingleton;
    }
    

    b.第二步
    防止alloc] init] 和new引起的错误,因为alloc] init] 和 new 实际是一样的工作原理.都是执行了下面方法

    // 防止外部调用alloc 或者 new
    + (instancetype)allocWithZone:(struct _NSZone *)zone {
        return [Singleton sharedSingleton];
    }
    

    c.第三步
    防止copy引起的错误,个人感觉当你的单例类不遵循NSCopying协议,外部调用本身就会出错. 如果不是业务需求不遵循协议,该方法也可以不写

    // 防止外部调用copy
    - (id)copyWithZone:(nullable NSZone *)zone {
        return [Singleton sharedSingleton];
    }
    

    d.第四步
    防止mutableCopy引起的错误,个人感觉当你的单例类不遵循NSMutableCopying协议,外部调用本身就会出错. 如果不是业务需求不遵循协议,该方法也可以不写

    // 防止外部调用mutableCopy
    - (id)mutableCopyWithZone:(nullable NSZone *)zone {
        return [Singleton sharedSingleton];
    }
    

    6.通知
    ①创建通知
    在这里插入图片描述
    ②注册通知
    在这里插入图片描述
    ③实现通知方法
    在这里插入图片描述
    7.目标动作回调
    目标就是接受事件的对象

    动作:事件反馈所要触发的方法
    在这里插入图片描述
    在这里插入图片描述

    8.回调-委托模式
    ①使用方法
    a.创建一个协议
    在这里插入图片描述
    b.创建一个Clock对象来当做Person对象的代理
    1.Clock对象继承协议并实现协议在这里插入图片描述
    在这里插入图片描述
    2.创建Person类同样继承协议并且声明代理成员属性
    在这里插入图片描述
    3.初始化Person和Clock并且将Clock赋值给代理成员属性,然后代理属性就能使用了
    在这里插入图片描述
    9.Block
    ①简介
    代码块Block是苹果在IOS4开始引入的对C语言的拓展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量,作为参数,作为返回值Block被广泛运用。
    注:block的声名与赋值只是保存了一段代码块,必须调用才能执行内部代码。
    ②使用()
    a.首先在目标对象声明一个Block
    在这里插入图片描述
    在这里插入图片描述
    b.在回调对象中实现Block代码块
    在这里插入图片描述
    在这里插入图片描述
    c.在目标对象中调用Block代码块
    在这里插入图片描述
    在这里插入图片描述
    ③把block当做参数
    a.声明函数
    1.第一种在这里插入图片描述
    2.第二种
    在这里插入图片描述
    b.block代码块实现
    在这里插入图片描述
    c.将方法赋值给block
    在这里插入图片描述
    注意:循环引用(会造成内存泄漏)
    a.将block转为弱引用
    在这里插入图片描述
    b.block赋值
    在这里插入图片描述

    七·UI控件

    1.页面生命周期
    ①页面初始化
    在这里插入图片描述
    ②页面将要出现
    在这里插入图片描述
    ③页面已经出现
    在这里插入图片描述
    ④页面将要消失
    在这里插入图片描述
    ⑤页面已经消失
    在这里插入图片描述
    ⑤页面释放
    在这里插入图片描述
    ⑤页面单机事件
    在这里插入图片描述
    2.UILable
    在这里插入图片描述
    3.UIButton
    在这里插入图片描述
    4.UIView
    在这里插入图片描述
    5.UITextFiled
    在这里插入图片描述
    代理方法
    在这里插入图片描述
    6.UIImage
    在这里插入图片描述
    7.UITableView
    ①声明UITableView成员属性
    在这里插入图片描述
    ②初始化UITableView
    在这里插入图片描述
    ④注册Cell
    在这里插入图片描述
    ⑤实现代理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    tableView系统左滑删除左滑动置顶链接

    8.UICollectionView
    ①声明UICollectionView
    在这里插入图片描述
    ②初始化UICollectionViewFlowLayout
    在这里插入图片描述
    ③初始化UICollectionView
    在这里插入图片描述
    ④注册UICollectionCell
    在这里插入图片描述
    ⑤代理
    在这里插入图片描述
    在这里插入图片描述
    9.WKWebView
    WKWebView完整版
    ①声明WKWebView
    在这里插入图片描述
    ②初始化WKWebView
    在这里插入图片描述
    ③设置Url
    在这里插入图片描述
    ④代理方法
    在这里插入图片描述
    完整篇https://www.jianshu.com/p/5cf0d241ae12

    10.UIalertController
    在这里插入图片描述

    八,ViewController

    1.UINavigationController
    ①设置UINavigationController的根视图
    在这里插入图片描述
    ②设置子页面
    在这里插入图片描述
    ③UIBarButtonItem
    在这里插入图片描述
    在这里插入图片描述
    2.TabBarController
    ①大致框架
    在这里插入图片描述
    ②设置字体颜色
    在这里插入图片描述
    ③设置原图片颜色
    在这里插入图片描述
    ④设置TabBar背景不透明
    在这里插入图片描述
    3.跳转
    ①push和present区别
    a.push与present都可以推出新界面。
    b.present与dismiss对应,push和pop对应。
    c.present只能逐级返回,push所有视图由视图栈控制,返回上一级,也可以返回到根vc,其他vc。
    present一般用于不同业务界面的切换,push一般用于同一业务不同界面之间的切换。
    ②present
    a.跳转
    在这里插入图片描述
    b.返回
    在这里插入图片描述
    ③push
    a.跳转
    在这里插入图片描述
    b.返回
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    4.页面布局
    ①横竖屏控制
    a.设置允许设置横竖

    ((AppDelegate *)[UIApplication sharedApplication].delegate).allocRotation=YES;
    

    b.创建UIDevice的延展并添加设置屏幕控制状态
    1)创建延展
    在这里插入图片描述
    2)声明set横竖屏状态方法

    +(void)setNewOrientation:(UIInterfaceOrientation)orientation;
    

    3)实现set横竖屏状态方法

    +(void)setNewOrientation:(UIInterfaceOrientation)orientation{
        NSNumber *resetOrientationTarger=[NSNumber numberWithInteger:UIInterfaceOrientationUnknown];
        [[UIDevice currentDevice]setValue:resetOrientationTarger forKey:@"orientation"];
        NSNumber *orientationTarger=[NSNumber numberWithInt:orientation];
        [[UIDevice currentDevice] setValue:orientationTarger forKey:@"orientation"];
    }
    

    ③调用修改横竖状态的方法

     [UIDevice setNewOrientation:UIInterfaceOrientationLandscapeRight];
    

    注意记得导入头文件

    #import "UIDevice+Direction.h"
    #import "AppDelegate.h
    

    5UIDevice和UIScreen
    ①UIDevice
    在这里插入图片描述
    ②UIScreen
    在这里插入图片描述
    6.手势
    ①点击
    在这里插入图片描述
    在这里插入图片描述
    ②轻扫
    在这里插入图片描述
    ③长按
    在这里插入图片描述

    九,IOS实用功能

    1.定制Cell
    在这里插入图片描述
    2.请求网络数据
    ①导入第三方库
    AFNetworking
    ②调用请求网络数据异步代理方法
    在这里插入图片描述
    3.下拉刷新
    ①导入第三方库
    MJRefresh
    ②调用下拉刷新的代理方法
    在这里插入图片描述
    ③结束
    在这里插入图片描述
    4.上拉加载
    ①导入第三方库
    MJRefresh
    ②调用上拉加载的代理方法
    在这里插入图片描述
    ③结束
    在这里插入图片描述
    5.沙河目录
    简介:沙河目录是一个用来存放本地持久化数据的文件夹,里面的数据在app更新是数据也不会被销毁,只有在APP被卸载的时候才会被销毁

    ①沙河目录

    NSString *homePath=NSHomeDirectory();
    NSLong(@"homePath=%@",homePath);
    

    ②document目录
    a.路径

    NSString *documentPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
    

    b.存取持久化小数据
    在这里插入图片描述
    c.plist存取
    在这里插入图片描述
    6.FMDB
    ①导入第三方库
    FMDB

    展开全文
  • 导读 目前移动端开发市场上引导开发者追求技多不压身,一个全栈开发者至少要懂后台服务器、数据库、Android、web、ios开发等。“一超多强”是指开发者先成为一门技术的专家然后掌握了解多门技术,这是一种好的发展...

    导读

           目前移动端开发市场上引导开发者追求技多不压身,一个全栈开发者至少要懂后台服务器、数据库、Android、web、ios开发等。“一超多强”是指开发者先成为一门技术的专家然后掌握了解多门技术,这是一种好的发展趋势,另外,这种技多不压身我认为当开发者更适合发展成为Leader管理岗位,随着年龄慢慢变大,成家立业后,基层单一码农已晋升之路受到阻碍了,作为项目经理或总监的时候,需要你能够“多才多艺”,才能管理好带领好你的团队。这一篇将掀起 IOS 开发之路,点关注不迷路。
     

    什么是iOS

    iOS是苹果公司为它的移动设备(iPhone、iPad、iWatch等)开发的移动操作系统

    iOS发展史

    • 2007年苹果发布iPhone Runs OS X
    • 2008年更名iPhone OS
    • 2010年更名iOS
    • 2012年WWCD 2012上发布iOS 6
    • 2013年WWCD 2013上发布iOS 7
    • 2014年WWCD 2014上发布iOS 8和Swift
    • 2015年WWCD 2015上发布iOS 9和Watch OS

    IOS开发语言

    ios目前流行两种开发语言:Objective-C 和 Swift 。前者有C语言基础者上手会容易些;后者Swift是iOS/Mac未来开发的主要语言,无论从编程思想还是从api书写,都赏心悦目,但缺点是没有Objective更稳定,且事实上去面试一些公司都要求的是用 Objective-C,只是把 Swift 作为学习语言。

    苹果设备屏幕尺寸

    设备屏幕尺寸分辨率坐标点
    iPhone 3和3s3.5英寸320*480320*480
    iPhone 4和4s(支持Retina)3.5英寸640*960320*480
    iPhone 5和5s(支持Retina)4英寸640*1136320*568
    iPhone 64.7英寸750*1334375*667
    iPhone 6 Plus5.5英寸1080*1920414*736
    iPad 1和2(不支持Retina)9.7768*1024768*1024
    iPad 3和4(支持Retina)9.71536*2048768*1024
    iPad Air9.71536*2048768*1024
    iPad Mini(不支持Retina)7.9768*1024768*1024
    iPad Mini2(支持Retina)7.91536*2048768*1024

    系统基础框架

     1、ios系统架构可以分为如图所示的四层,Cocoa Touch框架的地位不言而喻。 

    这里写图片描述
    • Core OS和Core Service提供了底层支持,包括文件访问、网络协议、低级数据类型等。
    • Media提供了基本绘图和音视频的支持,包括OpenGL、Quartz、Core Audio和Core Animation等。
    • Cocoa Touch包括了开发使用的大部分API,主要由Foundation(文件访问、网络操作、数据和容器类型)和UIKit(UI控件、控制器等)两个部分构成。在进行App开发时,应该由上到下使用这些技术层次,越上层的API封装得越好,开发越方便,但能自己发挥的东西越少。

    2、对比,android系统架构:

    Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。

    也分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

    UIKit继承结构



      实现App开发中的用户界面首先要从UIResponder及其子类开始研究,当然整个过程会覆盖整个UIKit框架,比如UIColor(颜色)、UIEvent(事件)、UIFont(字体)、UIGestureRecognizer(手势识别)、UIImage(图像)、UIScreen(屏幕)等诸多内容。

    UIView和UIWindow

    1、UIWindow和UIView的继承关系

      UIWindow是UIView的子类。UIView定义了一个矩形区域以及操作这个矩形区域中内容的编程接口,除此之外UIView还要处理运行时区域中内容的交互行为(绘图、动画和事件处理)。从上面的图中我们也可以看出,我们要使用的控件都是UIView的子类型。视图会按层次结构排列,位于视图层次结构顶端的就是应用窗体。任何应用都有且仅有一个UIWindow对象,UIWindow对象就像一个容器,负责包含应用中的所有视图。应用需要在启动时创建并设置UIWindow对象,然后为其添加其他的视图,就像上面的代码呈现的那样。加入窗口的视图会成为该窗口的子视图。子视图也可以有自己的子视图从而构成一个以UIWindow作为根的视图层次结构(树形结构)。

    这里写图片描述

    2、UIView的基本属性和方法

    • frame属性:设置视图的坐标和尺寸
    • backgroundColor属性:设置视图的背景色
    • window属性:视图所在的窗口对象
    • -addSubview方法:添加子视图

    Xcode创建iOS项目

      启动Xcode在欢迎页中选择"Create a new Xcode project"。在项目创建向导中选择iOS->Application->Single View Application然后点击下一步。接下来需要设置项目名称、组织名称、组织标识、开发语言(OC或Swift)和设备(iPhone、iPad或Universal)。下一步之后选择项目的位置就可以点击"Create"完成项目创建了。参考我的下一个博文:IOS新手入门第一个HelloWorld项目

    熟悉开发工具Xcode

    这里写图片描述

    IDE布局说明:

    Xcode的上方是工具栏,有很多工具按钮。Xcode的左侧是导航区域,包括:项目导航、符号导航、查询导航、问题导航、测试导航、调试导航、断点导航、报告导航,可以使用Command+1-8的数字键在8种导航之间切换。Xcode的中间是编辑器区域;中间的下面是调试区域。Xcode的右侧上方是检查器(审查)区域;右侧下方是各种库的区域。

    Xcode常用功能和快捷键 (*实用)

    [plain] view plain copy
    1. Command+[ -> 代码块左移  
    2. Comamnd+] -> 代码块右移  
    3. Tab -> 接受代码自动完成提示  
    4. Esc -> 显示代码提示  
    5. Command+B -> 编译  
    6. Command+R -> 运行  
    7. Control+F -> 前移光标  
    8. Control+B -> 后移光标  
    9. Control+P -> 光标移到上一行  
    10. Control+N -> 光标移到下一行  
    11. Control+A -> 光标移到行首  
    12. Control+E -> 光标移到行尾  
    13. Control+T -> 交换光标左右字符  
    14. Control+D -> 删除光标右边的字符  
    15. Control+K -> 删除本行  
    16. Control+L -> 将光标所在位置置于窗口中央  
    17. 按住Option双击鼠标 -> 搜索文档  
    18. Command+Y -> 激活/禁用断电  
    19. Command+Control+Y -> 继续运行  
    20. F6 -> 单步跳过  
    21. F7 -> 单步跳入  
    22. F8 -> 跳出  

    AppDelegate与ViewController的作用与区别:

    AppDelegate是你整个应用的一个代理。当你应用启动的时候,最先被调用到的就是你AppDelegate中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法。你可以在这个方法中做些全局初始化。

    一般设计准则是尽量保持AppDelegate干净、简洁。

    AppDelegate中可以做应用退出后台或从后台返回到前台的一些处理。

    ViewController一般作为根视图控制器,把显示相关的都放到这里面去做。

    虚拟机HOME键:

    由于Xcode自带的虚拟机不像真机那样有一个可以用手指按的Home键回到主界面的实体按钮,所以需要用到快捷键:
    command + shift + h    (回到主界面)
    command + shift + hh  (可滑动清理应用)
    展开全文
  • IOS基础知识

    2019-11-12 11:48:49
    类的定义 @interface SimpleClass : NSObject ## SimpleClass 继承自 NSObject @end 类的属性申明 @interface Person : NSObject ; @perperty NSString *firstName; @property NSString *lastName;...

    类的定义

    @interface SimpleClass : NSObject ## SimpleClass 继承自 NSObject
    @end

    类的属性申明

    @interface Person : NSObject ;
    @perperty NSString *firstName;
    @property NSString *lastName;
    
    @property NSNumber *yearOfBirth;  ## 指针类型 ,是个对象
    @property int yearOfBirth;## int值
    @property (readonly) NSString *firstName;  ##只可以读取
    @end
    

    + - 号方法

    - 减号方法

    @interface Person : NSObject
    -(void) someMethod;
    -(void)someMethodWithValue:(SomeType)value;
    -(void) someMethodWithFirstValue:(SomeType) info1 secondValue:(AnotherType) info2;
    @end
    

    + 加号方法

    静态方法 类方法
    

    完整例子

    Person.h 文件
    
    @interface Person :NSObject
    -(void) sayHello;
    @end
    
    Person.m 文件
    
    @import "person.h"
    @implementation Person
    -(void) sayHello{
    	NSLog(@"Hello,World!");
    } 
    

    基础常识

    常见数据类型

    1. int int a; int a=0; int c=a+b; 4字节 32 位
    2. float : float f; float f1=0.1; float f3=1.0;8字节
    3. double : double num; 8字节
    4. char : 1字节 char c=‘A’ ; C = ‘a’; char cc=c --> cc=‘A’;(区分大小写)
    5. NSString : @“hello word”
    6. C语言的字符串(OC中使用比较少):“hello word”

    限定词

    1. long: long int a; 4字节(和现在的int 表示的长度一直,原因早期的int 表示2字节的数据)
    2. long long :long long int 8字节
    3. short : short int a ;
    4. signed : signed int a;

    循环语句

    1. goto
    2. while
    3. do{} while(条件)至少执行一次
    4. switch 只支持 字符类型和数字类型。
    展开全文
  • iOS基础-01

    2020-07-28 12:49:41
    iOS基础-011、OC相对与Ca.在C的基础之上新增了一小部分面向对象的语法。b.将C的复杂的、繁琐的、可恶的语法封装的更加简单。c.OC完全兼容C语言。2、OC程序的源文件的后缀名是.m, m代表Message 代表OC中最重要的一个...
  • ios 基础学习

    2019-06-19 02:13:40
    oc 动态绑定 消息传递机制 oc 的方法吊用,其实就是对象接受一个消息,然后消息发送 动态绑定机制,寻找对应的方法体,直到找到方法体 然后执行 动态绑定 动态绑定是基于动态类型的,在运行时对象的类型确定后,那么...
  • iOS基础

    2019-07-01 21:45:10
    1、父类实现深拷贝时,子类如何实现深拷贝。父类没有实现深拷贝时,子类如何实现深拷贝? (1)区别:浅拷贝是指针的拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向这个对象的指针...
  • ios 基础知识点总结

    2018-07-24 12:00:07
    1、设置UILabel行间距 NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:label.text]; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];...
  • 今天1块学1下objective-c语言得入门知识知识吗,语言吗,所谓1通百通,假如您还有c语言得开发技术入门知识的基础能力当绕好,因为objective-c语言都是c语言变过来的,成为然,假如您还有别得语言得开发技术经验,...
  • iOS基础面试题(一)

    2016-03-23 18:19:35
    kaikaijia同学私信我,说想加群,我就建个iOS开发群,大家做技术交流和资源,群号:241048287,有兴趣的同学可以加群,验证信息:iOS+姓名。 iOS面试题系列: iOS面试题(二) iOS面试题(三) iOS面试题(四) 随着...
  • iOS基础面试题

    2015-01-30 15:03:49
    iOS基础面试题(二) iOS基础面试题(三) iOS基础面试题(四) iOS进阶面试题----Block部分 iOS进阶面试题----多线程部分 iOS进阶面试题----经典10道 iOS面试悲剧的应对方法 随着iOS平台开发的职位的增加,笔试、面试也...
  • iOS基础面试题(二)

    2016-03-21 15:03:00
    iOS面试题系列: iOS面试题(一) iOS面试题(三) iOS面试题(四) 1.Difference between shallow copy and deep copy? 浅复制和深复制的区别? 答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。 ...
  • iOS基础面试题(四)

    2013-11-27 10:33:57
    iOS面试题系列: iOS面试题(一) iOS面试题(二) iOS面试题(三) 1 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画? 答案:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以...
  • 本课程主要介绍了开发iOS app的一些基本情况。例如,需要的硬件和软件条件,如何申请开发者账号,XCode的常用功能介绍。后给出一个iOS App的案例来演示开发App的过程。
  • IOS 基础入门教程

    2013-12-12 23:52:41
    IOS 基础入门教程... C 基础知识创建第一款iPhone应用程序IOS操作(action)和输出口(Outlet)iOS - 委托(Delegates)IOS UI元素IOS加速度传感器(accelerometer)IOS通用应
  • RunLoop是什么,有什么作用,如何获取? 定义 RunLoop的实质是一个死循环,用于保证程序的持续运行,只有当程序退出的时候才会结束(由main函数开启主线程的RunLoop) ...保持程序的持续运行处理App中的各种事件...
  • 关于iOS基础总结(7)--ios各个版本新特性总结 ios7、ios8、ios9、ios10
  • iOS 基础类解析 - NSDate

    2014-05-04 10:47:48
    iOS 基础类解析 - NSDate
  • iOS 基础类解析 - NSNumber
  • iOS基础——通知代理之NSNotificationCenter、Delegate前言 NSNotificationCenter就像Android的广播接收者,它可以通过发送通知,让监听通知的者收到通知,并执行相应事件,它是一种一对多的事件通知 Delegate就像...
1 2 3 4 5 ... 20
收藏数 158,016
精华内容 63,206
关键字:

ios基础