天河网站建设策划,大型网站建设的必须条件,南京网站设计开发,wordpress文章显示数量基础理解篇
Objective-C是一种面向对象的编程语言#xff0c;它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中#xff0c;元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等…基础理解篇
Objective-C是一种面向对象的编程语言它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等。
#import Foundation/Foundation.hinterface MyClass : NSObject
property (nonatomic, strong) NSString *name;
- (void)printName;
endimplementation MyClass
- (void)printName {NSLog(%, self.name);
}
endint main(int argc, const char * argv[]) {autoreleasepool {MyClass *myObj [[MyClass alloc] init];[myObj printName];// 动态添加属性和方法[[myObj class] addMethod:selector(sayHello:) withSignature:v];[[myObj class] addProperty:age withType:integerValue withAttribute:NONE];// 动态调用方法((void (*)(id, SEL))[[myObj class] performSelector:selector(sayHello:) withObject:nil]))(myObj, selector(sayHello:));// 动态添加属性((void (*)(id, SEL, id))[[myObj class] performSelector:selector(setProperty:forKey:) withObject:[NSNumber numberWithInt:100] forKey:age])(myObj, selector(setProperty:forKey:), 100);// 动态删除属性和方法[[myObj class] removeMethod:selector(sayHello:)];[[myObj class] removeProperty:age];}return 0;
}
Objective-C是一种动态编程语言它将静态语言在编译和链接时需要做的一些事情给延后到运行时执行。例如方法的调用只有在程序执行的时候才能具体定位到哪个类的哪个方法。这就需要一个运行时库就是Runtime。 Runtime机制是指Objective-C运行时系统它提供了一些类和方法来帮助我们动态地创建、修改和访问对象。其中最重要的是objc_msgSend函数它可以用来发送消息并调用对象的方法。除此之外还有很多其他的类和方法可以用来实现动态行为比如class_addMethod、method_exchangeImplementations等等。
推荐阅读什么是元编程(meta-promgramming)
工程知识篇
1.Xcode创建工程
Xcode创建工程iOS–App–填写工程名选择语言OC\Swift–选择存放路径一般放在User目录下访达–前往–个人可以打开用户个人文件夹 。理由忘了欢迎评论区大佬解答
2.创建工程后AppDelegate 和 ViewController的说明
AppDelegate是应用程序委托对象其父类是UIResponder类继承关系并实现UIApplicationDelegate委托协议. [UIResponder:实现应用程序的处理响应事件的能力] [UIApplicationDelegate委托协议使AppDelegate成为应用程序的委托对象这种对象能够响应应用程序的生命周期] 生命周期在程序运行的不同阶段进行回调
//AppDelegate.h#import UIKit/UIKit.hinterface AppDelegate: UIResponder UIApplicationDelegateproperty (strong,nonatomic) UIWindow* window //ios程序视图中只有一个UIWindowend//AppDelegate.m#import AppDelegate.hinterface AppDelegate()endimplementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLauchingWithOptions:(NSDictionary *)launchOptions{return YES;}
//应用启动并进行初始化时会调用该方法并发出通知UIApplicationDidFinishLauchingNotification.这个阶段会实例化根视图控制器- (void)applicationWillResignActive:(UIApplication *)application{}
//应用从活动状态进入非活动状态时调用该方法并发出通知UIApplicationWillResignActiveNotification- (void)applicationDidEnterBackground:(UIApplication *)application{}
//应用进入后台时候调用该方法并发出通知UIApplicationDidEnterBackgroundNotification- (void)applicationWillEnterForeground:(UIApplication *)application{}
//应用进入前台时候但未处于活跃状态时候调用该方法并发出通知UIApplicationWillEnterForegroundNotification- (void)applicationDidBecomeActive:(UIApplication *)application{}- (void)applicationWillTerminate:(UIApplication *)application{}
//应用被终止时候调用该方法并发出通知UIApplicationWillTerminateNotification但内存清除时除外end作者星辰_入海
链接https://www.jianshu.com/p/859d11e1e2fd关于ViewController更详细的说明可参考viewController详解 文章备用链接https://www.pianshen.com/article/13491799244/#google_vignette 重点摘录如下流程图有些没仔细描述、推荐看原文
1. view的生命周期 当一个视图控制器被创建并在屏幕上显示的时候。 代码的执行顺序 1、 alloc 创建对象分配空间 2、init (initWithNibName) 初始化对象初始化数据 3、loadView 从nib载入视图 通常这一步不需要去干涉。除非你没有使用xib文件创建视图 4、viewDidLoad 载入完成可以进行自定义数据以及动态创建其他控件 5、viewWillAppear 视图将出现在屏幕之前马上这个视图就会被展现在屏幕上了 6、viewDidAppear 视图已在屏幕上渲染完成 当一个视图被移除屏幕并且销毁的时候的执行顺序这个顺序差不多和上面的相反 1、viewWillDisappear 视图将被从屏幕上移除之前执行 2、viewDidDisappear 视图已经被从屏幕上移除用户看不到这个视图了 3、dealloc 视图被销毁此处需要对你在init和viewDidLoad中创建的对象进行释放 关于viewDidUnload 在发生内存警告的时候如果本视图不是当前屏幕上正在显示的视图的话 viewDidUnload将会被执行本视图的所有子视图将被销毁以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建 的对象释放内存。 因为当这个视图再次显示在屏幕上的时候viewLoad、viewDidLoad 再次被调用以便再次构造视图。
2. view的加载过程 3. view卸载过程图 推荐看ViewController生命周期实例
3. 应用程序状态以及不同场景下的变化
应用程序可能所处的状态 不同场景下状态的变化
应用启动场景
描述当用户第一次启动程序时候或者终止后再次启动 (1)Not running -- Inactive (2)Inactive -- Active
应用退出场景
描述分为两种可能1.可以在后台运行或者挂起2.不可以在后台运行和挂起
Step1
(1)Active -- Inactive
(2)Inactive -- Background
(3)Background -- Suspended
Step2:
(1)Active -- Inactive
(2)Inactive -- Background
(3)Background -- Suspended
(4)Suspended -- Not running 应用挂起重新运行场景
(1)Suspended -- Background
(2)Background -- Inactive
(3)Inactive -- Active
应用终止状态
内存清除后应用程序终止可能是强制清除内存还可以是使用者手动清除
Background -- Suspended -- Not running
作者星辰_入海 链接https://www.jianshu.com/p/859d11e1e2fd
4.IOS开发多线程
参考资料IOS开发多线程讲解(一)–结合斯坦福ios7开发(十 爬过的坑
5.UITableviewCell复用机制
参考资料UITableviewCell复用机制 爬过的坑
6.类方法和实例方法调用
7. 属性strong和copy的区别
8.小概念nib segue kvc kvo
nibNIB是Non-interactive Interface Builder的缩写是一种可视化的界面设计工具。它可以让你通过拖拽控件来设计界面而无需编写代码。NIB文件通常包含多个窗口、视图和控制器等元素这些元素可以相互连接并设置属性。 segue
KVC是Key-Value Coding的缩写即键值编码。它是一种动态获取对象属性值的方法。KVC可以通过字符串来访问对象的属性例如object.valueForKey(“name”)。 KVO是Key-Value Observing的缩写即键值观察。它是一种动态监听对象属性变化的方法。KVO可以通过添加观察者来实现当被观察对象的属性发生变化时观察者会收到通知并作出相应处理。 下面是一个使用KVC和KVO的代码实例
// 创建一个Person类
interface Person : NSObject
property (nonatomic, strong) NSString *name;
endimplementation Person
end// 创建一个Person对象并设置name属性
Person *person [[Person alloc] init];
person.name Tom;// 使用KVC获取name属性值
NSString *name [person valueForKey:name];
NSLog(name is %, name);// 使用KVO监听name属性变化
[[person addObserver:self forKeyPath:name options:NSKeyValueObservingOptionNew context:nil]];// 修改name属性值
person.name Jerry;// 手动发送name属性变化的通知
[[person didChangeValueForKeyPath:name notification:nil];
9. weak strong 循环引用
什么是循环引用 循环引用是指两个对象相互强引用了对方即retain了对方从而导致两个对象都无法被释放引发了内存泄漏现象。 在Objective-C中循环引用通常发生在两个对象之间其中一个对象持有另一个对象的强引用而另一个对象也持有第一个对象的强引用。这种情况下即使第一个对象被释放了第二个对象也不会被释放因为它们之间存在循环引用。这种情况可能会导致内存泄漏和其他问题。
循环引用实例
interface Person : NSObject
property (nonatomic, strong) Person *friend;
endimplementation Person
synthesize friend _friend;
endPerson *person1 [[Person alloc] init];
Person *person2 [[Person alloc] init];// person1持有了person2的强引用而person2也持有了person1的强引用
person1.friend person2;
person2.friend person1;[person1 release]; // 释放person1对象在这个例子中Person类有一个属性friend它是一个指向其他Person对象的指针。当创建两个Person对象时它们相互持有对方的强引用形成了循环引用。当其中一个对象被释放时由于它持有另一个对象的强引用所以另一个对象也无法被释放从而引发了内存泄漏问题。
为了避免造成循环引用代理一般需使用弱引用 例子
#import UIKit/UIKit.h//新建一个协议协议的名称一般是由:类名Delegateprotocol ViewControllerBDelegateNSObject//代理方必须实现的方法
required//代理方可选实现的方法
optional
- (void)ViewControllerBsendValue:(NSString *)value;
endinterface ViewControllerB : UIViewController//委托代理人为了避免造成循环引用代理一般需使用弱引用
property(weak,nonatomic) idViewControllerBDelegate delegate;
//id是一个通用的数据类型表示任何对象。在这个例子中idViewControllerBDelegate表示一个遵循ViewControllerBDelegate协议的对象的通用指针。
//这行代码定义了一个名为delegate的属性其类型为ViewControllerBDelegate的弱引用。这意味着这个属性可以指向任何遵循ViewControllerBDelegate协议的对象但是这个对象并不会增加delegate的引用计数。因此当delegate所指向的对象被释放时它不会影响ViewControllerB对象的内存管理。
end 代码实战篇
2.
//
// AppDelegate.m
// ExampleCode
//
//#import AppDelegate.h
#import ViewController.hinterface AppDelegate ()endimplementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 第一个页面ViewController *viewController [[ViewController alloc] init];//UINavigationController *navigationController [[UINavigationController alloc] initWithRootViewController:viewController];// 初始化并显示第一个页面self.window [[UIWindow alloc] init];self.window.backgroundColor [UIColor whiteColor];self.window.frame [[UIScreen mainScreen] bounds];//获取手机宽高
// CGSize size_screen self.window.frame.size;
// CGFloat scale_screen [UIScreen mainScreen].scale; //屏幕缩放比
// NSLog(the width of screen is:%f,size_screen.width*scale_screen); //1170 像素分辨率px
// NSLog(the height of screen is:%f,size_screen.height*scale_screen); //2532
// NSLog(the width of screen is:%f,size_screen.width); //390
// NSLog(the height of screen is:%f,size_screen.height); //844self.window.rootViewController viewController;[self.window makeKeyAndVisible];return YES;
}end
工具篇
2.
小tips
如何使用Podfile