ios学习之个人总结(精选18篇)由网友“一人花开”投稿提供,下面是小编为大家准备的ios学习之个人总结,欢迎阅读借鉴。
篇1:iOS学习之WebView的使用
1、初始化WebView
- (void)viewDidLoad
{
[super viewDidLoad];
webView = [[UIWebView alloc] initWithFrame.:CGRectMake(0, 0, 320, 480)];
NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:@www.baidu.com]];
[self.view addSubview: webView];
[webView loadRequest:request];
}
2、
实现协议,在ViewController.h修改如下
#import@interface ViewController : UIViewController
{
UIWebView *webView;
}
@end
UIWebView中几个重要的函数
1.- (void )webViewDidStartLoad:(UIWebView *)webView 网页开始加载的时候调用
2.- (void )webViewDidFinishLoad:(UIWebView *)webView 网页加载完成的时候调用
3.- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 网页加载错误的时候调用
先在viewDidLoad 的webView实例化下面加上
[webView setDelegate:self];设置代理,这样上面的三个方法才能得到回调。
3、加载等待页面
- (void) webViewDidStartLoad:(UIWebView *)webView
{
//创建UIActivityIndicatorView背底半透明View
UIView *view = [[UIView alloc] initWithFrame.:CGRectMake(0, 0, 320, 480)];
[view setTag:108];
[view setBackgroundColor:[UIColor blackColor]];
[view setAlpha:0.5];
[self.view addSubview:view];
activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame.:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
[activityIndicator setCenter:view.center];
[activityIndicator setActivityIndicatorViewStyle.:UIActivityIndicatorViewStyleWhite];
[view addSubview:activityIndicator];
[activityIndicator startAnimating];
}
加载完成或失败时,去掉loading效果
- (void) webViewDidFinishLoad:(UIWebView *)webView
{
[activityIndicator stopAnimating];
UIView *view = (UIView*)[self.view viewWithTag:108];
[view removeFromSuperview];
NSLog(@webViewDidFinishLoad);
}
- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
[activityIndicator stopAnimating];
UIView *view = (UIView*)[self.view viewWithTag:108];
[view removeFromSuperview];
}
篇2:IOS学习笔记之 Socket 编程
最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”,所以在今天,开始好好学习IOS。(本人之前4年都是搞.Net的,java也培训过一年)
打算学IOS,从哪入手呢?给大家推荐两本入门书吧《Beginning iOS 7 Development》、《Objective-C.程序设计(第4版)》,正好两只手,一手一本。
但是我学习都是先学习基础、理论,但是动手做的时候不要对着书上的例子去学那几个控件的用法,掌握不了所有的,不如用的时候去帮助文档看看用法。即使学会了也只会那几个控件的那几个属性而已,最好是想一个小项目,然后自然而然的就用到了所有控件。
所以今天想编一个socket的例子,虽然简单,但是在做的时候还是遇到了不少小麻烦。
编码前的准备工作:
我是用的xcode6,所以准备socket库的时候使用了支持ARC的GCDAsyncSocket
1、到网上下载GCDAsyncSocket 地址:CocoaAsyncSocket/GCD at master · robbiehanson/CocoaAsyncSocket · GitHub
2、服务器端代码(我已经用.NET写了个简单的)
直接贴上后台代码了:
1、头文件
#import
#import “GCDAsyncSocket.h”
@interface ViewController : UIViewController
{
NSString *host;
uint16_t port;
GCDAsyncSocket *socket;
}
@property NSTimeInterval socketTimeOut;
@property (weak, nonatomic) IBOutlet UILabel *txtTitle;
@property (weak, nonatomic) IBOutlet UIButton *btnClickMe;
@property (weak, nonatomic) IBOutlet UITextField *txtQQ;
@property (weak, nonatomic) IBOutlet UITextField *txtPwd;
@property (weak, nonatomic) IBOutlet UISlider *sldValue;
@property (weak, nonatomic) IBOutlet UIButton *btnConnectSocket;
@property (weak, nonatomic) IBOutlet UILabel *lblSocketStatus;
@property (weak, nonatomic) IBOutlet UIButton *btnSendMsg;
- (IBAction)btnClickMe_Click:(id)sender;
- (IBAction)txtPwd_DoneEditing:(id)sender;
- (IBAction)sldValue_Changed:(id)sender;
- (IBAction)btnConnectSocket_click:(id)sender;
- (IBAction)btnSendMsg_Click:(id)sender;
2、m文件变量初始化
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
host = @“192.168.1.103”;
port = 52710;
self.socketTimeOut = 100;
}
3、链接服务器
//链接socket服务器按钮单击事件
- (IBAction)btnConnectSocket_click:(id)sender {
_lblSocketStatus.text = host;
socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue];
socket.delegate = self;
NSError *err = nil;
BOOL connState=[socket connectToHost:host onPort:port error:&err];
if(!connState)
{
_lblSocketStatus.text = [_lblSocketStatus.text stringByAppendingString:err.description ];
}
else
{
NSLog(@“连接服务器:%@ 成功”,host);
}
}
4、发送信息
//发送信息单击事件
- (IBAction)btnSendMsg_Click:(id)sender {
[socket writeData:[_txtQQ.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
NSLog(@“发送的QQ号码:%@”,_txtQQ.text);
[socket readDataWithTimeout:self.socketTimeOut tag:0];
}
这里还调用了
1
readDataWithTimeout 方法来读取服务器返回的信息
5、接收信息
//读取服务器获取的数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSString *newMessage = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@“接收到服务器返回的信息:%@”,newMessage);
[socket readDataWithTimeout:self.socketTimeOut tag:0];
}
到此就完成了简单的socket收发信息,可以自己再加工加工完成一个简单的IM小项目了,
篇3:IOS 开发学习总结objectivec面向对象之――方法
objective-c 的方法不能独立存在,所有的方法都必须定义在类里,方法在逻辑上,要么属于类,要么属于对象。
方法的所属性
不难发现,方法在语法上和功能上,方法与函数很相似。其实,方法是由传统的函数发展而来的。
objective-c 调用函数时的传参机制和调用方法时的传参机制是一样的,都是值传递,都是传入参数的副本。
方法与传统的函数的显著不同:
在结构化编程语言里,函数是一等公民。整个程序是由一个一个函数组成;
面向对象的语言里,类是一等公民。因此在 OC 里方法不能独立存在,必须属于类或者对象。
由于 objective-c 里的方法不能独立存在,也不能像函数那样独立执行,执行方法时必须使用类或者对象作为调用者。
由上,objective-c 中方法的所属性主要体现在下面的3个方面:
1. 方法不能独立定义,只能在类体里定义。
2. 方法在逻辑上,要么属于类,要么属于对象。
3. objective-c 里的方法不能独立存在,也不能像函数那样独立执行,执行方法时必须使用类或者对象作为调用者。
形参个数可变的方法
如果在定义方法时,在最后一个形参名后增加逗号和三点(,…),就表明该形参可以接受多个参数值。
为了在程序中获取个数可变的形参。需使用如下关键字:
- va_list:这是个用于定义指向可变参数列表的指针变量。
- va_start:这是个函数。指定开始处理可变形参的列表,并让指针变量指向可变形参列表的第一个参数。
- va_end:结束处理可变形参,释放指针变量。
- va_arg:该函数返回指针当前指向的参数的值,并将指针移动到指向下一个参数。
如下示例程序:
头文件:VarArgs.h
#import
实现文件:VarArgs.m
#import VarArgs.h@implementation VarArgs- (void)test:(NSString *) name, ...{ // 使用va_list定义一个argList指针变量,该指针变量指向可变参数列表 va_list argList; // 如果为第一个name参数存在,才需要处理后面的参数 if (name) { // 由于name参数并不在可变参数列表中,因此先处理name参数 NSLog(@%@ , name); // 让argList指向第一个可变参数列表的第一个参数,开始提取可变参数列表的参数 va_start(argList, name); // va_arg用于提取argList指针当前指向的参数,并将指针移动到指向下一个参数 // arg变量用于保存当前获取的参数,如果该参数不为nil,进入循环体 NSString* arg = va_arg(argList, id); while (arg) {// 打印出每一个参数.NSLog(@%@,arg);// 再次提取下一个参数,并将指针移动到指向下一个参数arg = va_arg(argList, id); } // 释放argList指针,结束提取 va_end(argList); }}@endint main(int argc , char * argv[]){ @autoreleasepool{ VarArgs* va = [[VarArgs alloc] init]; [va test:@疯狂iOS讲义 , @疯狂Android讲义, @疯狂Ajax讲义 , nil]; }}
本质上说,这个可变参数也是个类似数组的结构,
最后要指出的是,个数可变的形参只能处于形参列表的最后。即:一个方法中最多只能有一个长度可变的形参。
篇4:IOS学习计划
最近开始看ios相关的东西,打算一边看,一边在这里写一些东西,主要是一些学习的笔记。既然是笔记,就和教程不一样,这不是完整的学习资料。我一直觉得编程语言最好的资料就是官方的文档,其他也就是辅助。 这里的准备包括软件和硬件,要是有足够的学习能力,仅仅看文档就能理解内容的话,那就没有什么要特别准备的,能上网,到官方网站看资料就好了。这里说说像我这样需要一边看资料一边动手的人要准备些什么。
硬件
硬件在学习阶段不是必须的,但如果有的话,能更好理解ios和开发环境。 1. 运行macos的苹果电脑。如果资金不是很紧张,建议买一台。开发环境xcode仅能运行于mac系统。并且io(于:ios学习计划)s是基于mac os修改而来的,他们有很多共同的理念,用macos有助于了解ios。如果实在不想买,可以考虑在pc上装一个mac。但mac支持的硬件远不如windows多,这就是说有相当一部分pc无法完美运行mac。关于如何在pc上装mac,感兴趣的话可以搜索关键词“黑苹果”。
2. 一个运行ios的设备。如果不购买苹果的开发帐号,是不能在ios上运行自己开发的程序。但我觉得有台iphone/itouch/ipad,体验一下其他开发者的程序,分析一下哪里做得好,哪里不足,对自己的开发很有好处。 帐号 苹果免费的开发帐号可以用任意email直接注册,注册后可以访问大部分资源。比如,读开发文档,下载sdk,下载wwdc视频等。 收费的开发帐号价格是$99/年,在免费帐号的基础上增加了下载beta版sdk、真机调试,app store发布等权限。
如果仅仅是学习,可以先注册一个免费帐号,等到需要时再付费。 软件 ios的开发是使用苹果的sdk,开发环境为xcode。开发的sdk可以通过免费开发帐号在
苹果网站下载:
sdk的目前是2.45g,由于需要认证,很多下载软件不能使用。如果网速比较慢又容易断,下载将是一个很痛苦的过程。 如果你有一台网络速度还可以的服务器,可以考虑先将sdk下载到服务器,然后可以使用下载工具下载。
教程
首先是官方网站,上面东西很多,很全。 第三方内容,推荐斯坦福的iphone课程cs 193p: 大学毕业生学习ios软件开发有前途吗 ios软件开发并不像以前的软件那样,不需要进行深层次的开发。只需要把相应的模块打包起来,就可以得到不同功能的ios软件。北 京无限互联开设了ios软件开发课程,面向所有专业的学员,四个月打造ios软件开发高手。 所以大学毕业生学习ios软件开发也是可以的,经过努力一样可以成为软件高手。
篇5:IOS学习计划
一.概述
编程语言:C语言、C++(可选)、Objective-C(主要)、Swift
(注:为什么选择用Objective-C而不用Swift)
开发工具:Xcode
电脑系统:Mac OS X
真机设备:iPhone、iPad等(可选)
iOS证书:调试证书(可选)、发布证书(可选)
二.学习计划
第一阶段(2days)
熟悉macOS操作;包括各种日常软件使用和窗口使用等,学习部分UNIX指令。
第二阶段(10days)
复习/学习C语言;包括基本语法、运算、函数、数据结构和流程控制等。因为C语言多数函数库可以在objective-C中直接使用,所以再熟悉一下C语言很重要。
第三阶段(20days)
学习objective-C语言;包括基本语法、内存管理和面向对象。重点是掌握其面向对象的思想,掌握用类创建对象的方法解决问题。
第四阶段(7days)
学习Cocoa touch;Cocoa touch包括Foundation和UIkit,Foundation是所有程序开发的基础框架,包含多种对象集合,如数组、字典等。而UIkit前端框架,是一个轻量级的可快速构建强大的web前端界面的工具。
第五阶段(20days——∞)
项目实战;可以模仿已有的app进行开发,将其界面当做需求文档来模仿。从UI到icon等等的设计发现问题并解决。实际上多数的app的UI都大同小异,比如常用的新浪微博、微信、各大媒体新闻app基本都是底部app控制器形式。如果可以参照现有的app做出一套自己的框架,可以在日后的开发过程中反复使用。
这一阶段包括app的UI优化和iOS版本适配等。
IOS是什么意思
iOS(原名:iPhone OS)是由苹果公司为移动设备所开发的操作系统,支持的设备包括iPhone、iPod touch、iPad、Apple TV。与Android及Windows Phone不同,iOS不支持非苹果的硬件设备。系统操作(iOS 7)占用约700-900MB左右的存储空间(其中iPhone、iPod touch占约700MB,iPad占约900MB)。
篇6:IOS 手势之左右滑动
1. 在“ViewController.h”中增加两个手势property.
?1 2@property (nonatomic, strong) UISwipeGestureRecognizer *leftSwipeGestureRecognizer;
@property (nonatomic, strong) UISwipeGestureRecognizer *rightSwipeGestureRecognizer;
并synthesize到“ViewController.m”文件中.2.在“ViewController.m”文件中的“ViewDidLoad”方法中增加如下代码:
?1 2 3 4 5 6 7 8self.leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipes:)];
self.rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipes:)];
self.leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
self.rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:self.leftSwipeGestureRecognizer];
[self.view addGestureRecognizer:self.rightSwipeGestureRecognizer];
3.并在“ViewController.m”中增加如下方法;
?1 2 3 4 5 6 7 8 9 10 11 12 13 14- (void)handleSwipes:(UISwipeGestureRecognizer *)sender
{
if
(sender.direction == UISwipeGestureRecognizerDirectionLeft) {
CGPoint labelPosition = CGPointMake(self.swipeLabel.frame.origin.x - 100.0, self.swipeLabel.frame.origin.y);
self.swipeLabel.frame. = CGRectMake( labelPosition.x , labelPosition.y , self.swipeLabel.frame.size.width, self.swipeLabel.frame.size.height);
self.swipeLabel.text = @
“ 的, 你在往左边跑啊....”
;
}
if
(sender.direction == UISwipeGestureRecognizerDirectionRight) {
CGPoint labelPosition = CGPointMake(self.swipeLabel.frame.origin.x + 100.0, self.swipeLabel.frame.origin.y);
self.swipeLabel.frame. = CGRectMake( labelPosition.x , labelPosition.y , self.swipeLabel.frame.size.width, self.swipeLabel.frame.size.height);
self.swipeLabel.text = @
“ 的, 你在往右边跑啊....”
;
篇7:IOS开发之NSURL
1:NSURL初始化方法:
NSURL
2:解决NSURL初始化失败的相关解决方案.
将传进来的NSString 进行 UTF8 转码即可.
1:针对 URLWithString 初始化失败的解决方案
NSString
strLocalHtml
strLocalHtml=
NSURL
2:针对 fileURLWithPath 初始化失败的解决方案
self.filePathString
NSURL
转码成功后 会自动 在字符串左侧添加file:///
3:NSURL 成功初始化后可以获取的参数 (摘自:NSURL 学习
NSURL
NSLog(@Scheme:
NSLog(@Host:
NSLog(@Port:
NSLog(@Path:
NSLog(@Relative
NSLog(@Path
NSLog(@Parameter
NSLog(@Query:
NSLog(@Fragment:
NSLog(@User:
NSLog(@Password:
结果如下:
-03-31
2012-03-31
2012-03-31
2012-03-31
2012-03-31
2012-03-31
2012-03-31
)
2012-03-31
2012-03-31
2012-03-31
2012-03-31
2012-03-31
4:根据文件名称和文件后缀获取程序包内容文件的路径
NSURL
URLForResource:文件名称
withExtension:文件后缀
subdirectory:在程序包中的哪个子目录中寻找.
如果没有找到将会返回nil
找到后返回如下路径:
篇8:iOS多线程之NSOperation
1.NSOperation的理解
NSOperation本身是一个抽象的基类,我们要自己子类化NSOpeartion并封装我们要完成的任务,系统提供了两个比较方便的子类NSInvocationOperation和NSBlockOperation,NSInvocationOperation方便我们以现有的方法来初始化一个operation,NSBlockOperation是方便我们从Block来初始化operation,所有的NSOperation都有如下特征:
支持NSOperation对象之间建立依赖关系,当一个operation的所有依赖的operation都执行完了自己才会执行。支持可选的completion block,当operation的主任务完成之后调用。支持通过KVO通知来监控operation的执行状态。支持指定operaion的优先级来安排operation的相对指向顺序。支持operation的取消操作来停止operation执行。
2.NSOperation的执行
通常情况下我们要并发执行的话只要简单的把operation添加到operation queue中就行,operation queue负责创建线程并发地执行operation任务。
MyOperation *operation = [MyOperation alloc] init];
NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
[aQueue addOperation:operation];
我们也可以直接通过NSOpeartion的start方法来处理operation任务,这样执行的话任务的处理是在start调用的线程中同步执行的。
MyOperation *operation = [MyOperation alloc] init];
[operation start];
isConcurrent属性返回的就是operation要执行的任务相对于调用start的线程是同步的还是异步的,isConcurrent默认返回NO。当然我们也可以自己创建线程来执行NSOperation的start方法达到并发执行的效果。
3.NSInvocationOperation的使用
@implementation MyCustomClass
- (NSOperation*)taskWithData:(id)data
{
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data];
return theOp;
}
// This is the method that does the actual work of the task.
- (void)myTaskMethod:(id)data
{
// Perform. the task.
}
@end
4.NSBlockOperation的使用
?
1
2
3
4
5
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^
{
NSLog(@“Beginning operation.n”);
// Do some work.
}];
NSBlockOperation可以通过addExecutionBlock:方法添加多个block,只有所有block都执行完成的时候,operation才算是完成。
5.自定义NSOperation
NSOperation提供了一个基本结构,具体相关的并发执行的方法、operation依赖、KVO通知和取消操作还是需要我们自己实现的。整个NSOperation子类实现如下:
@interface MyOperation : NSOperation {
BOOL executing;
BOOL finished;
}
- (void)completeOperation;
@end
@implementation MyOperation
- (id)init {
self = [super init];
if (self) {
executing = NO;
finished = NO;
}
return self;
}
- (void)start {
// Always check for cancellation before launching the task.
if ([self isCancelled])
{
// Must move the operation to the finished state if it is canceled.
[self willChangeValueForKey:@“isFinished”];
finished = YES;
[self didChangeValueForKey:@“isFinished”];
return;
}
// If the operation is not canceled, begin executing the task.
[self willChangeValueForKey:@“isExecuting”];
[self main];
executing = YES;
[self didChangeValueForKey:@“isExecuting”];
}
- (void)main {
@autoreleasepool {
BOOL isDone = NO;
while (![self isCancelled] && !isDone) {
// Do some work and set isDone to YES when finished
}
[self completeOperation];
}
}
- (void)completeOperation {
[self willChangeValueForKey:@“isFinished”];
[self willChangeValueForKey:@“isExecuting”];
executing = NO;
finished = YES;
[self didChangeValueForKey:@“isExecuting”];
[self didChangeValueForKey:@“isFinished”];
}
- (void)cancel {
[super cancel];
//取消网络请求
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return executing;
}
- (BOOL)isFinished {
return finished;
}
@end
并发operation需要实现以下方法:
startmainisConcurrentisExecutingisFinished NSOperation支持KVO的属性有:
isCancelledisConcurrentisExecutingisFinishedisReadydependenciesqueuePrioritycompletionBlock 不是所有的属性都要我们发送KVO通知,如果我们覆盖了start方法,就要像上面的代码一样在适当的地方发出isExecuting和isFinished的通知,
如果我们实现了自己的addDependency:或者removeDependency:,就要适当的地方发送dependencies的通知。
6.配置NSOperation
6.1依赖管理
我们可以通过addDependency:给当前operation添加依赖operation,依赖关系不限于operation是否在一个队列里。注意我们不要自己生成循环依赖,这样会造成死锁。
6.2优先级管理
在队列里的operation的执行顺序取决于operation的状态(是否准备就绪)和相对优先级。是否准备就绪取决于operation的依赖operation是否完成,执行队列会优先考虑operation,如果高优先级的operation没有准备就绪,执行队列就会先执行低优先级的operation。operation的相对优先级只针对同一队列,就是说一个低优先级的operation可能比另一个队列里高优先级的operation优先执行。
6.3底层线程优先级管理
我们可以通过setThreadPriority:设置operation系统级别的线程优先级,优先级由0.0到1.0浮点数指定,默认是0.5。我们自己设置的系统级别的线程优先级只针对main方法执行期间有效,其他方法都是按照默认优先级执行。
参考链接:Concurrency Programming Guide
篇9:IOS 开发学习总结 objectivec面向对象之――类和对象(下)
局部变量和成员变量重名的情况下,局部变量会隐藏成员变量,
为了在方法中强行引用成员变量,可以使用 self 关键字进行区分。
示例代码:
FKWolf.h文件
#import
FKWolf.m 文件
#import FKWolf.h@implementation FKWolf// 定义一个setName:ageAge方法- (void) setName: (NSString*) _name andAge: (int) _age{ // 当局部变量隐藏成员变量时, // 可用self代表调用该方法的对象,这样即可为调用该方法的成员变量赋值了。 self->_name = _name; self->_age = _age;}// 定义一个info方法- (void) info{ NSLog(@我的名字是%@, 年龄是%d岁 , _name , _age);}@endint main(int argc , char * argv[]) { @autoreleasepool{ FKWolf* w = [[FKWolf alloc] init]; [w setName: @灰太狼 andAge:8]; [w info]; }}
篇10:IOS 开发学习总结 objectivec面向对象之――类和对象(下)
当 self 作为对象的默认引用使用时,程序可以像访问普通指针变量一样访问这个 self引用,甚至可以把 self 当成普通方法的返回值。
示例程序:
ReturnSel.m文件
#import
说明:使用 self 作为方法的返回值可以使代码更加简洁,但可能造成实际意义的模糊。
id 类型
id 类型可以代表所有对象的类型。任意类的对象都可赋值给 id 类型的变量。
通过 id 类型的变量来调用方法时,objective-c 将会执行动态绑定。动态绑定:objective-c 将会跟踪对象所属的类,会在运行时判断该对象所属的类,并在运行时确定需要动态调用的方法,而不是在编译时确定要调用的方法。
示例程序:
#import
篇11:iOS学习知识小结
iOS学习小结
1.关联
objc_setAssociatedObject关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
2.tableView的beginUpdates 和 endUpdates
3.关于代码与storyBoard的自动布局
4.国际化与本地化,为了实现全球化
5.技巧
可以通过设置Scheme来设置app所运行的语言,你想要什么语言就是什么语言,而不用重新设置系统的语言。
6.ios8新特性,加载js
如果我想要加载一个形如网页的东西,那么我需要对整个网页进行动态的编辑,图文混编,但是这样做那面会带来很困难的操作,其实服务端那边很好的可以解决这个问题,用一个网页即可以搞定。服务端那边只需返回一个html文档,然后客户端根据这个html文档进行解析即可。
WKWebView新特性
· 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
· 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
· 支持了更多的HTML5特性;
· 高达60fps的滚动刷新率以及内置手势;
· 将UIWebViewDelegate与UIWebView重构成了14类与3个协议
7.技巧
写 函数的时候一定要判断数据的安全性,这样出错的几率就会很小,尤其是要判断它的类型安全,是否为空等,不然程序会奔溃。还有需要注意的地方就是,写每一个函数的时候要多方面进行考虑,考虑代码的合法性。使用前不判断参数的正确性,在函数内部对参数的可靠性进行判断。如果这样的话,你用到函数的时候都需要对这些参数进行判断其合法性如果放倒函数中那么只需要判断一次就可以了。
8.应用内购买
9.利用sqlite创建索引,索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
10.数据库版本的更新,当应用数据表需要添加新表的时候,需要对数据插入新的字段,那么久需要更新数据库
11.友盟统计,当应用上线后可以观察到应用的日志文件,crash日志,页面记时日志,收集并归类崩溃日志,提供错误管理及分析工具,帮助开发者更好的解决问题,从而提高应用的稳定性,改善应用质量。
12.使用js的时候需要使用webView
[webView stringByEvaluatingJavaScriptFromString:scriptString];
13.做常用设备登陆的策略可以使用服务器,服务器把所有登陆过的设备都存储下来。
14.涉及到系统偏好设置的选项,把它都放到一个文件中,这样修改起来比较容易。
15.利用VVDocumenter-Xcode自动生成注释,也就是xcode的插件.运行VVDOcumenter-Xcode编译后,重新打开xcode即可以使用了
16.如何使用xib进行界面的搭建,利用file’s owner进行关联,形如storyBoard中的segue
17.如何在一个项目中使用多个storyBoard
18.如何利用代码与storyBoard或者XIB进行自动布局
19、XIB进行国际化
首先在工程中需要添加你想要使用的语言,然后新建视图的时候选择使用XIB,这样xcode就会自动为你新建一个xib文件,然后在inspector中的localization中选择localized,开始时一定要选择base,然后勾选其他语言,这样你发现XIB文件会有子目录,然后在子目录下你可以设置不同的语言翻译。
20.tableView小技巧
根据设置不同的identifier取出不同类型的cell,在设置identifier的时候可以设置成类名,这样的话就可以省很多事,而且很方便。
21. 技巧
[[UIApplication sharedApplication] setStatusBarHidden:YES];
22.版本控制
gitLab和sourceTree结合使用对源代码进行管理,如何进行相关的配置
23.发送语音消息
三方库opencore-amr
24.Sqlcipher+FMDB,数据库文件加密
www.zetetic.net/sqlcipher/ios-tutorial/
25.技巧
图片浏览XHImageViewer
26.技巧
根据button的不同状态可以设置button的事件,相当于微信发送语音信息的按钮,按住录音,松开结束录音并发送消息,
27.技巧
把block指针变量设置成私有的,这样是不是很好用。
28.关于runloop的一些了解,runloop是一种运行池,是和多线程有关的东西,监听事件的产生,如果有新事件,那么runloop会监听,一旦监听到了,就会执行监听到的方法。
29.技巧
关于用户头像的问题,点击放大,等其他手势的库ESImageViewController
30.技巧
NSString *pullSuccessIdString = [pullSuccessMsgIds componentsJoinedByString:@“,”];
把数组中的每个元素用逗号拼接成一个字符串
31.数据共享
Multipeer Connectivity Framework ,近距离通信,双方建立连接后可以彼此进行通信
32.问题
oc中不支持多继承,也就说一个类只能继承至一个类,不能继承多个类。实现多继承可以使用协议来实现,也就说某个类中可以继承多个协议,这久相当于多继承,我可以拥有很多协议并且实现它。
33.multipeerConnectivity的实现,对文件进行共享
34.indexPathForSelectedRow
35如何给另一台电脑进行真机调试
《1》导出p12文件
《2》导出描述文件
《3》在另一台电脑上双击即可以安装了
篇12:学习ios前景怎么样
学习ios前景
放眼全球 ios表现可嘉
根据千锋教育官方数据统计显示,iOS平台和Android平台市场占有率又有所提升,共同占据了总市场85.6%的份额。数据显示,Android目前占据52.2%的市场份额,比4月份增长了1.4%,而iOS平台目前占比33.4%,比4月上涨2.0%。
人才招聘 供不应求
iPhone在全球创造的庞大应用市场,使应用开发公司开始争抢iOS开发者。另外,由于iOS系统开发技术走在全球手机系统的前端,其他系统平台应用开发公司和系统研发公司也在同时高薪挖角。72%的招聘公司称,他们正在招聘iOS平台开发人才,其中38%的招聘公司表示,iOS平台开发经验要比任何其他平台开发经验更受招聘公司青睐。
国内现状 缺少ios开发人才
由于国内iOS开发起步相对较晚,人才培养机制更是远远跟不上市场发展速度。有限的iOS开发人才成了国内企业必争的资源。甚至有的企业不得不考虑通过收购或者进行企业ios培训来填补人才空缺。一名iOS开发新手要比普通软件开发新手高出约20-30%的薪资,符合条件或有项目经验的开发工程师的薪资水平更是惊人!
iOS的历史
对于iPhone大家再熟悉不过了,而对于它的操作系统iOS你的了解又是多少?iOS在6月正式进入大家的视线,20第四季度,苹果公司的iOS占据了全球智能手机操作系统26%的市场份额。10月4日,苹果公司宣布iOS平台的应用程序已经突破50万个。6月,苹果公司在WWDC 上宣布了iOS 6,提供了超过 200 项新功能。,苹果公司在秋季新品发布会上正式提供iOS7下载更新。
短短的几年间,iOS经历了多个版本的升级更新换代。iOS已经成长为一个市场上影响力最大、功能最丰富、生态最完整的移动操作系统。
iOS的现在
,苹果公司在WWDC 上发布了iOS 8,并提供了开发者预览版更新。iOS的一种新的编程语言Swift又引来大家的纷纷关注。Swift,作为一项苹果独立发布的支持型开发语言,某种意义上Swift作为苹果的新商业战略,将吸引更多的开发者入门,从而增强App Store和Mac Store本来就已经实力雄厚的应用数量基础。
iOS开发培训机构的兴起,iOS开发人员的高薪就业也用数据用事实反映着大家对于iOS很看好。数据是最好的证明,用数据来告诉你关于iOS的就业情况。数据来源千锋教育53名毕业学员,月平均就业129人。
IOS开发前景
1 IOS历史
对于iPhone大家再熟悉不过了,而对于它的操作系统iOS你的了解又是多少?
iOS在年6月正式进入大家的视线,2010年第四季度,苹果公司的iOS占据了全球智能手机操作系统26%的市场份额。
2010月4日,苹果公司宣布iOS平台的应用程序已经突破50万个。
206月,苹果公司在WWDC 2012上宣布了iOS 6,提供了超过 200 项新功能。
2013年,苹果公司在2013秋季新品发布会上正式提供iOS7下载更新。
在WWDC发布了iOS10、watchOS和macOS Sierra,然而还是有许多产品苹果没有提及,短短的几年间,iOS经历了多个版本的升级更新换代。
iOS已经成长为一个市场上影响力最大、功能最丰富、生态最完整的移动操作系统。
2IOS现状
iOS是目前最为流行、最热门的操作系统之一,在全球有着不可替代的地位,iOS系统的苹果手机在中国也属于高端品牌。
从品牌以及系统技术含量上来看,iOS就业岗位都属于高端企业。而且基于iOS系统的app应用程序开发更是行业的旗帜。但由于我国iOS开发起步较晚,人才培养体系还跟不上市场的发展速度,iOS开发人才都成为我国企业必争的资源。
3IOS人才缺口
目前,苹果公司在全球的市场占有比例高达28%,也催生了一大批iOS开发人才,未来iOS开发行业的前景值得期待。此外,从事iOS开发技术是当前走在手机系统的前端,众多系统平台应用开发公司以及系统研发公司正在高薪挑选iOS开发人才。
据智联招聘统计报告显示,目前有72%的公司急缺iOS平台开发人才,未来iOS开发人才市场发展潜力提升,其中有38%的公司表示iOS开发人才倍受青睐,具有iOS开发经验的人才比其他任何平台开发经验的人才更受青睐。因此,未来iOS开发行业的前景一片光明。
4IOS薪水
既然说到人才缺口大,那我们就不得不说说薪资的情况,我们可以随意的点开一些招聘网站,看下各个编程岗位的开价,姑且以一线城市1~3年工作经验来看:
· Android & iOS开发月薪范围大概在10—20K
· Java 、PHP、.Net等月薪大概在8—15K
· 一些小众语言如Ruby、Python等月薪范围大概在10—20K
5产品多样化
苹果现在不只是单纯的做原有的那些核心产品,iphone、ipad、imac等,现在也开始做苹果汽车、appleTV、apple Watch,甚至有传闻称近几年很火的VR,苹果也想要分一碗羹。
这些产品的出现,势必需要应用的开发,iOS开发人员缺口会进一步增大,iOS程序员炙手可热!
6IOS程序职业情景好
iOS开发的岗位具有App应用开发工程师、游戏开发工程师、测试工程师、UI设计师等,不管是哪一个职位都处于人才紧缺的状态。因此只要具备iOS相关的技能并且拥有一定的项目实战经验就可以找到一份不错的工作。
篇13:iOS开发学习之触摸事件和手势识别
iOS的输入事件
触摸事件
手势识别
手机摇晃
一、iOS的输入事件
触摸事件(滑动、点击)
运动事件(摇一摇、手机倾斜、行走),不需要人为参与的
远程控制事件(耳机控制手机声音)
1⃣️iOS事件对象都是UIEvent类的实例
UIEvent类对事件类型定义了enum常量:
typedef NS_ENUM(NSInteger, UIEventType){
UIEventTypeTouches,
UIEventTypeMotion,
UIEventRemoteControl,
};
触摸事件必须是继承UIResponser的
二、触摸事件
1⃣️UIView,有4种处理不同的触摸事件
UIView是UIResponder的子类,可以覆盖下列4个方法处理不同的触摸事件,
1. 一根或者多根手指开始触摸屏幕
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
2.一根或者多根手指在屏幕上移动(随着手指的移动,会持续调用该方法)
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
3.一根或者多根手指离开屏幕
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
4.触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
复制代码
#pragma mark - UITouch事件
#pragma mark 触摸开始
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@“触摸开始”);
for (UITouch *touch in touches) {
NSLog(@“%@”, touch);
}
}
#pragma mark 触摸移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@“触摸移动Touch对象个数:%d”,[touches count]);
// 要移动界面上黄颜色的视图
// 1. 得到当前手指的位置
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
// 2. 得到上一次手指的位置
CGPoint preLocation = [touch previousLocationInView:self.view];
// 3. 计算两个位置之间的偏移
CGPoint ffset = CGPointMake(location.x - preLocation.x, location.y - preLocation.y);
// 4. 使用计算出来的偏移量,调整视图的位置
[_demoView setCenter:CGPointMake(_demoView.center.x + offset.x, _demoView.center.y + offset.y)];
// 完整的UITouch事件调试方法
NSLog(@“触摸移动”);
for (UITouch *touch in touches) {
NSLog(@“%@”, touch);
}
}
#pragma mark 触摸结束
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
// 完整的UITouch事件调试方法
NSLog(@“触摸完成”);
for (UITouch *touch in touches) {
NSLog(@“%@”, touch);
}
}
#pragma mark 触摸中断
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
// 完整的UITouch事件调试方法
NSLog(@“触摸中断”);
for (UITouch *touch in touches) {
NSLog(@“%@”, touch);
}
}
复制代码
2⃣️触摸事件的处理
如果hit-test视图无法处理事件,则通过响应者链向上传递
1.如果hit-test视图的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图
2.如果视图或它的控制器无法处理收到的事件或消息,则将其传递给该视图的父视图
3.每一个在视图继承树中的上层视图如果不能处理收到的事件或消息,则重复上面的步骤1,2
4.在视图继承树的最上层视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给窗口对象进行处理
5. 如果窗口对象也不能进行处理,则其将事件或消息传递给UIApplication对象
6.如果UIApplication也不能处理该事件或消息,则将其丢弃
当用户点击屏幕时,会产生一个UITouch对象传递给UIApplication,然后由window负责查找最适合相应触摸事件的视图对象(hitTest,pointInside)
找到合适的视图之后,Touch方法由对应的视图完成,上级视图不再接管
3⃣️不接受处理事件的三种方法
不接收用户交互:userInteractionEnabled = NO;
隐藏:hidden = YES;
透明:alpha = 0~0.01
三、手势识别
1⃣️iOS目前支持的手势识别(6种)
UITapGestureRecognizer(点按)
UIPinchGestureRecognizer(捏合)
UIPanGestureRecognizer(拖动)
UISwipeGestureRecognizer(轻扫)
UIRotationGestureRecognizer(旋转)
UILongPressGestureRecognizer(长按)
2⃣️手势识别的使用方法(4步)
通常在视图加载的时候定义(UIGestureRecognizer是抽象类,需要实例化使用)
创建手势识别实例
设置手势识别属性,例如手指数量,方向等
将手势识别附加到指定的视图之上
编写手势触发响应方法
3⃣️手势识别的状态(7个)
1. // 没有触摸事件发生,所有手势识别的默认状态
UIGestureRecognizerStatePossible,
// 一个手势已经开始但尚未改变或者完成时
UIGestureRecognizerStateBegan,
// 手势状态改变
UIGestureRecognizerStateChanged,
// 手势完成
UIGestureRecognizerStateEnded,
// 手势取消,恢复至Possible状态
UIGestureRecognizerStateCancelled,
// 手势失败,恢复至Possible状态
UIGestureRecognizerStateFailed,
// 识别到手势识别
UIGestureRecognizerStateRecognized =UIGestureRecognizerStateEnded
2.手势识别的属性
state——手势状态
view——手势发生视图
常用方法
locationInView 获得手势发生对应视图所在位置
复制代码
- (void)viewDidLoad
{
[super viewDidLoad];
/**
1. 演示点按手势
*/
// 根据实例化方法,我们知道:
// 1.有一个处理消息的对象,应该是self
// 2.我们需要定义一个方法,当手势识别检测到的时候,运行
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
// setNumberOfTapsRequired 点按次数
[tap setNumberOfTapsRequired:1];
// setNumberOfTouchesRequired 点按的手指数量
[tap setNumberOfTouchesRequired:1];
// 把手势识别增加到视图上
[self.demoView addGestureRecognizer:tap];
/**
篇14:ios个人评价简历
1. 热爱ios软件开发
2. 责任心强,良好的沟通能力
3. 乐于学习新技术,自学能力强
4. 良好的沟通协作意识,能够承担工作压力。在未来的工作中,我将以充沛的精力,刻苦的精神努力的工作。希望您给我一个展现自己的机会。
简历自我评价范文二:
本人性格开朗与人处事融洽,有较强的亲和力,并且有很强的责任心和应变能力。对待工作善始善终,能承受日益严峻的竞争压力,并能在成功与失败中完善积累自己。通过这些年的工作经历,使我具备了良好的沟通能力和团队合作精神,擅长团结与培养新人,爱好广泛,学习意识及能力强。谨于言而敏于行。渴望在财务领域有更大的发展空间
简历自我评价范文三:
本人在电子信息技术和计算机方面有过几年的工作经验,随之转做进出口贸易,在20xx到20xx年间,就职于xx公司参与了公司的组建到成熟运营,20xx年后就职于xx从事进出口协调工作,积累了一定的市场经验。
简历自我评价范文四:
本人品行端正,原则性强;有责任心、还有较强的学习能力、适应能力和团体协作能力;纯真朴实、积极向上、勤奋好学。通过两年的学习,本人掌握了计算机的基础知识,养成了良好的处事习惯。例如细心、耐心、谨慎等。
简历自我评价范文五:
本人做事谨慎,细心耐心,诚实守信,善于听取他人意见,集思广义,勇于挑战自我,时间观念强,有着良好的生活习惯,有较强的责任心及良好的人际关系和沟通能力,学习刻苦认真,相信可以胜任相关工作。
篇15:iOS开发之圆角指定
如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架),而若要指定某几个角(小于4)为圆角而别的不变时,这种方法就不好用了。
对于这种情况,Stackoverflow上提供了几种解决方案。其中最简单优雅的方案,就是使用UIBezierPath。下面给出一段示例代码。
UIView *view2 = [[UIView alloc] initWithFrame.:CGRectMake(120, 10, 80, 80)];view2.backgroundColor = [UIColor redColor];[self.view addSubview:view2]; UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view2.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];maskLayer.frame. = view2.bounds;maskLayer.path = maskPath.CGPath;view2.layer.mask = maskLayer;
其中,
byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight
指定了需要成为圆角的角,
该参数是UIRectCorner类型的,可选的值有:
* UIRectCornerTopLeft* UIRectCornerTopRight* UIRectCornerBottomLeft* UIRectCornerBottomRight* UIRectCornerAllCorners
从名字很容易看出来代表的意思,使用“|”来组合就好了。
篇16:iOS 多线程之NSThread简单使用
1、线程的构建和开启:
?
1
2
3
4
5
(1)_thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(threadOneMethod) object:nil];
_thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(threadTwoMethod) object:nil];
[_thread1 start];
[_thread2 start];
先构建,然后开启,好处是可以控制开启的时间,并且可以得到NSThread对象,便于之后和这个线程通讯,iOS 多线程之NSThread简单使用
。?
1
2
(2) [NSThread detachNewThreadSelector:@selector(threadOneMethod) toTarget:self withObject:nil];
(3) [self performSelectorInBackground:@selector(threadOneMethod) withObject:nil];
还有一种是从系统的NSThread继承一个子类,这个子类的构建和父类一样,但是线程内执行的代码是写在-(void )main方法里面的:?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@interface MyThread : NSThread //从NSThread继承
@end
////////////////////
-(void )main{
for (int i = 0; i<10; i++) {
NSLog(@“myThread count: %d”,i);
sleep(1);
}
NSLog(@“thread end”);
}
// 使用自定义的线程对象
_thread3 = [[MyThread alloc]init];
[_thread3 start];
相对而言,前面3个方法构建的线程,线程内执行的方法都是在当前的类文件里面的,而使用main函数,线程中执行的方法是属于线程对象本身的,这样可以在任何其他需要使用这个线程方法的地方使用,而不用在实现一次方法,2、线程同步,即线程锁的使用:
(1)@synchronized关键词:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-(void )threadOneMethod{
@synchronized(@“lock”){
for (int i= 0; i<10; i++) { //循环10次,每次输出一个标识,然后线程沉睡一秒
NSLog(@“111”);
sleep(1);
}
}
NSLog(@“thread1 end”);
}
///////////////////////
-(void )threadTwoMethod{
@synchronized(@“lock”){
for (int i= 0; i<5; i++) { //循环5次,每次输出一个标识222,然后线程沉睡1秒
NSLog(@“222”);
sleep(1);
}
}
NSLog(@“thread2 end”);
}
篇17:iOS 开发之数据库(SQLite)
SQLite嵌入式数据库优点:
1.嵌入式数据库
2.支持事件,不需要配置,不需要安装,不需要管理员
3.支持大部分SQL92标准
4.完整的数据库保存在磁盘上面一个文件,同一个数据库文件可以在不同机器上面使用,最大支持数据库到2T
5.整个系统少于3万行,少于250KB的内存占用
开始使用SQLite:
1.引入头文件
2.打开数据库
3.执行SQL命令
4.关闭数据库
以下代码展示整个数据库的 打开、关闭、增加、删除、查找、修改,
创建一个单例:
#import
#import DataBaseHandle.h#import
#import
在 ViewController.m中 ViewDidLoad 调用方法
//打印路径 NSLog(@%@,[[DataBaseHandle shareDB] documentsPath]); //打开数据库 [[DataBaseHandle shareDB] openDB]; //创建表 [[DataBaseHandle shareDB] createTable]; //插入信息// Student *stu = [[Student alloc] init];// stu.name = @小露;// stu.age = @29;// stu.sex = @女;// [[DataBaseHandle shareDB] insertStudent:stu]; //修改// [[DataBaseHandle shareDB] updateMessage]; //删除// [[DataBaseHandle shareDB] deleteMessage]; //查找全部信息// [[DataBaseHandle shareDB] selectAllStudent]; //根据条件查找信息 [[DataBaseHandle shareDB] selectWithSex:@女];
篇18:iOS开发之类别、扩展
类别:
在ios项目开发中允许使用类别为现有的类添加新的方法,并不需要创建子类,通过类别我们可以动态地为现有的类添加新的方法,可以将类的定义模块化地布局到多个相关文件中。
使用类别的好处为:
一、进行模块化设计
二、利用类别来调用私有方法
接口部分格式如下:
@interface 已有类 (类别名)
//方法的定义
.....
@end
注意:类别中通常只定义新的方法。
类别的实现部分的语法格式如下:
@implmentation 已有类(类别名)
//方法的实现
@end
我先创建一个old类
再chuangjian一个新类别,如上图
在旧类和新类分别创建了方法,最后在main.m函数调用方法:
扩展
扩展与类别相似,扩展相当于匿名类别,格式如下:
@interface 已有类 ()
//方法的定义
.....
@end
类别与扩展的区别在于:
类别一般不重新再增加变量,只增加新的方法,而扩展可以,
扩展只有接口文件(.h)而没有实现文件(.m)定义的方法通通在类里边实现
★ 安卓实习心得感悟
★ 学习计划app
★ 通信自我鉴定范文
★ 鲸鱼知识小结作文
【ios学习之个人总结(精选18篇)】相关文章:
redis的个人学习总结2023-01-01
ios项目总结怎么写2022-12-04
考研计算机专业大纲解析之数据结构2022-11-19
日常工作报告2023-09-26
苹果发布iOS 8.0.2解决通话与指纹解锁问题2022-09-13
计算机考研大纲解析2023-03-19
苹果iOS和谷歌安卓用户界面风格对比及技术总结2023-02-15
安卓的英文是什么2023-11-13
android学习十九(WebView的用法)2022-09-29
安卓论文开题报告2022-09-16