苹果开发重要语法知识.docx
- 文档编号:18029361
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:24
- 大小:55.17KB
苹果开发重要语法知识.docx
《苹果开发重要语法知识.docx》由会员分享,可在线阅读,更多相关《苹果开发重要语法知识.docx(24页珍藏版)》请在冰点文库上搜索。
苹果开发重要语法知识
苹果开发重要语法知识
2013-01-0422:
03:
56|分类:
默认分类|字号订阅
感谢这位大大
iphone开发中,自定义协议有什么用?
iphone开发中,自定义协议
自定义协议语法如下:
@protocol协议名称
方法之声明
@end
Objective-C2.0中协议的新特性:
(1)@optional预编译指令:
表示可以选择实现的方法
(2)@required预编译指令:
表示必须强制实现的方法。
例如:
@protocolFrameworkDelegate
@optional//可选的(正式协议)有这个做标志
-(void)didReceiveCM:
(Framework*)frameworkChatMessage:
(ChatMessage*)cm;
-(void)QUserArrived:
(Framework*)frameworkAddressBook:
(NSMutableArray*)ab;
//如果@optional放在此处,表示上面2个方法内部必须实现,下面2个方法可选
-(void)AllUserArrived:
(Framework*)frameworkAddressBook:
(NSMutableArray*)ab;
-(void)ConversationListChanged:
(Framework*)frameworkConversationList:
(NSMutableArray*)cl;
@end
协议表示了方法可以被任何类所实现。
协议本身不是类。
他们只是简单定义了一个其他对象可以实现的接口。
当你的类实现了协议中的某个方法的时候也就是说你的类实现了那个协议。
Objective-C的另一个扩展称为协议,它非常象Java中的接口。
两者都是通过一个简单的方法声明列表发布一个接口,任何类都可以选择实现。
协议中的方法通过其它类实例发送的消息来进行调用。
iPhone程序开发里,object-c里的delegate怎么理解?
答:
设置代理
然后就可以实现协议了。
相当于C++里实现一个接口,或Java里实现一个抽象类里的抽象方法。
有些类里不仅可以设置代理,还可以为其设置数据源(比如一些模态窗口UIActionSheet之类的)。
有很多时候是需要在B类口中来完成一些对A类的操作,这时就需要A设个代理让B来完成了,这个在应用中很常见也很实用。
NSTimer定时器的基本操作方式
NSTimer是Cocoa中比较常用的定时器类,基本操作如下:
handleTimer方法可以自行定义。
在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次。
-(void)handleTimer:
(NSTimer*)timer
{
//在这里进行处理
}
NSTimer*timer;
timer=[NSTimerscheduledTimerWithTimeInterval:
0.5
target:
self
selector:
@selector(handleTimer:
)
userInfo:
nil
repeats:
YES];
在Cocoa中使用JSON(重要基础知识)
JSON是一种新的用于在互联网上进行数据交换的标准格式。
由于它的冗余、可读性和可解析性都比XML要好,因此JSON这种数据交换格式越来越广泛地运用于Web应用,尤其是Ajax应用中。
在Cocoa中使用JSON也很简单,目前有两个JSON的框架,都很容易使用,而且都对NSDictionary进行了扩展,您可以选择其一将JSON“揉”到您的Cocoa应用程序里。
一个叫做BSJSonAdditions,由BlakeSeely开发。
将NSDictionary对象转成JSON字符串只需要进行如下转换:
[dictjsonStringValue];
就可以返回一个NSString的JSON格式。
反过来如果希望将JSON字符串转成NSDictionary,只需要进行如下转换:
[NSDictionarydictionaryWithJSONString:
jsonString]
就可以返回NSDictionary的对象了。
另一个叫做json-framework,参考了BSJSonAdditions,并且以framework的方式提供。
json-framework的用法同样类似,使用NSDictionary或者NSArray的JSONRepresentation方法来获取JSON的NSString字符串,用NSString的JSONValue方法来获取转换后的NSDictionary或者NSArray对象。
Objective-C内存管理的几点总结(非常重要的基础知识)
1.当你使用new、alloc或copy创建对象时,对象的countretain到1。
你一定要负责把这个对象release或autolease掉。
这样当它的生命周期结束时,它才能清空。
2.当你使用其他方法获得一个对象时,你可以认为它已经retain了一个count,并且autolease掉了。
你不用考虑和它相关的清理问题。
但是如果你想保留这个对象,那么你需要retain它,并且要确保之后你release了这个对象。
3.如果你retain一个对象,你最终总是需要release或者autolease它。
这三条规则在写代码的时候一定要遵守,一旦遵守了一般也就不会有内存泄露的问题。
在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket。
视图里两个事件的区别(重要语法知识)
viewdidload事件就是只有产生的时候才响应,重新打开的时候是没响应的。
viewWillAppear就是每次出现的时候的消息,在load之后。
顺道写下image的一些用法
UIImage*iamge=[UIImageimageNamed:
@"***.png"];
cell.imageView.image=image;
iphone开发-NSTimer定时器的基本操作方式
NSTimer是Cocoa中比较常用的定时器类,基本操作如下:
handleTimer方法可以自行定义。
在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次。
-(void)handleTimer:
(NSTimer*)timer{//在这
NSTimer是Cocoa中比较常用的定时器类,基本操作如下:
handleTimer方法可以自行定义。
在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次。
-(void)handleTimer:
(NSTimer*)timer//
{
//在这里进行处理
}
NSTimer*timer;
timer=[NSTimerscheduledTimerWithTimeInterval:
0.5
target:
self
selector:
@selector(handleTimer:
)
userInfo:
nil
repeats:
YES];
repeates设置成YES的时候会隔0.5s就做一次handleTimer,调试的时候就会发现,timer所在的函数和handleTimer是来回执行的,个人理解是在这个函数执行完之后才执行这个handleTimer的,设置成NO时,handletTimer就只执行一次.
theConnection=[[NSURLConnectionalloc]initWithRequest:
theRequestdelegate:
self];
nt=[NSTimerscheduledTimerWithTimeInterval:
20target:
selfselector:
@selector(handleTimer)userInfo:
nilrepeats:
NO];
-(void)handleTimer{
}
-(void)connection:
(NSURLConnection*)connectiondidReceiveResponse:
(NSURLResponse*)response
{
[webDatasetLength:
0];
NSLog(@"connection:
didReceiveResponse:
1");
}
-(void)connection:
(NSURLConnection*)connectiondidReceiveData:
(NSData*)data
{
[webDataappendData:
data];
NSLog(@"connection:
didReceiveData:
2");
}
//如果电脑没有连接网络,则出现此信息(不是网络服务器不通)
-(void)connection:
(NSURLConnection*)connectiondidFailWithError:
(NSError*)error
{
//NSLog(@"ERRORwiththeConenction");
[theConnectionrelease];
theConnection=nil;
[webDatarelease];
webData=nil;
}
-(void)connectionDidFinishLoading:
(NSURLConnection*)connection
{
}
上面是我在用的时候所涉及的代码,只写出了函数,可以自己实验下,看函数的执行顺序以及同异步的关系
@Propery讲解
property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。
这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。
注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。
锁被加到所属对象实例级(我是这么理解的...)。
经常备用到的参数是copy/reain/assign。
在其中选择一个来确定属性的setter如何处理这个属性。
很多Objective-C中的object最好使用用retain,一些特别的object(例如:
string)使用copy。
assign关键字代表setter直接赋值,而不是复制或者保留它。
这种机制非常适合一些基本类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。
readonly关键字代表setter不会被生成,所以它不可以和copy/retain/assign组合使用。
我们把summary定义为readonly是因为它并不需要一个专门的类变量,相应的,我们会在用到的时候动态生成它:
定时器
设置定时器下面显示的定时器将在一秒钟后触发,并一直重复直到定时器被禁用。
定时器每次激活时,就会调用发送选择器消息的目标来进行初始化。
回调方法带有一个参数,就是定时器本身.要禁用一个定时器,给它发送invalidate消息,这将释放定时器对象并把它从当前运行循环中删除。
NSTime*timer;
timer=[NSTimerscheduledTimerWithTimeInterval:
1.0target:
selfselector:
@selector(handlTimer:
)userInfo:
nilrepeats:
YES];
-(void)handleTimer:
(NSTimer*)timer{
printf("timercount:
%d",count++);
if(count>3)
{
[timerinvalidate];
}
iphone开发之-启动页面设置(重要的iphone开发经验)
不管是开发个人项目还是公司项目,大家通常都有一个需求,就是,在app启动的时候,指定一定的时间来显示自己的或者公司的logo,那么,我就将刚刚写好的启动加载页面设置代码贡献出来。
这里我需要用到NSTimer这个东西,相关的内容可以查看API,有比较详细的解释。
新建一个项目,随便是什么项目,我建立的是“viewbasedapplication”,然后,命名为“Logo”,然后确定。
直接编辑“Resources"目录下的"LogoViewController.xib”。
将背景颜色改称绿色,主要是为了当从logo页跳转过来的时候能有感觉到变化。
然后新建一个NSTimer.
logoviewcon*lo=[[logoviewconalloc]initWithNibName:
@"logoviewcon"bundle:
nil];
self.logo=lo;
[lorelease];
[windowaddSubview:
self.logo.view];
//初始化timmer
NSTimer*timer=[NSTimerscheduledTimerWithTimeInterval:
1.5target:
selfselector:
@selector(logo:
)userInfo:
nilrepeats:
YES];
注意,初始化的代码中有这么一段:
@selector(logo:
),其中的方法就是当这个1.5秒时间过去之后自动调用的方法。
-(void)logo:
(NSTimer*)timer{
[logo.viewremoveFromSuperview];
[timerinvalidate];//这句代码用来终止timmer,否则,每过1.5秒,就会执行该方法一次,我们是要在开始的时候执行一次就够了。
}
线程(重要基础知识)
1.创建一个新的线程:
[NSThreaddetachNewThreadSelector:
@selector(myMethod)
toTarget:
self
withObject:
nil];
2.创建线程所调用的方法:
-(void)myMethod{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
***codethatshouldberuninthenewthreadgoeshere***[poolrelease];
}
假如我们需要在线程里面调用主线程的方法函数,就可以用performSelectorOnMainThread来实现:
[selfperformSelectorOnMainThread:
@selector(myMethod)
withObject:
nil
waitUntilDone:
false];
[superviewDidLoad];是什么意思?
有什么作用?
-(void)viewDidLoad函数里边[superviewdidload]是必须的嘛?
首先,viewDidLoad是视图控制器类用于加载视图的方法。
其次,super就是调用父类中的方法。
[superviewDidLoad]就是调用父类中的viewDidLoad方法。
父类中的viewDidLoad会帮助你做一些初始化的工作,比如A是基类,B从A继承,B在viewDidLoad方法中创建和初始化了一些成员,
C继承B,如果C在调用viewDidLoad的时候没有调用super的viewDidLoad方法,那么就会有一些成员没有被初始化,可能就会产生问题。
为何需要调用“superviewDidLoad”?
-(void)didReceiveMemoryWarning{
[superdidReceiveMemoryWarning];
}
-(void)viewDidLoad{
[superviewDidLoad];
}
在上面的代码中,什么需要调用父类相应的方法呢?
以viewDidLoad为例,父类(super)中的viewDidLoad会帮助你做一些初始化的工作,比如A是父类,B继承A,B在viewDidLoad方法中创建和初始化了一些成员;
C又继承B,此时,如果C在调用viewDidLoad的时候没有调用super的viewDidLoad方法,那么就会有一些成员没有被初始化,可能就会产生问题。
initWithFrame:
和initWithCoder:
区别
1.initWithCoder:
对于.xib,视图加载时默认调用的是该方法;
2.initWithFrame:
非.xib的手动编码,视图加载时默认调用的是该方法。
所有初始化的代码都放到上面方法内部调用。
另,对于.xib,也可以在awakeFromNib方法里面放额外的初始化动作。
Objective-C利用协议实现回调函数(类似java的回调函数)
在编写iphone开发时,最常用的就是回调函数。
自己编写回调函数,实现动态加载数据,加载完数据之后就利用回调函数通知给前台页面,显示相应数据的界面。
在iphone中利用协议可以很容易的实现回调函数,后台加载数据,然后显示在前台页面。
-(id)init{
//先讓父類別進行初始化
if(self=[superinit]){
//dosomething
}
returnself;
}
if(self=[superinit])首先的是[superinit],使超类完成自己的初始化工作。
if(self=[superinit])这条语句的意思,[superinit]是初始化父类中的变量方法,self=[superinit]就相当于子类也初始化了这些变量和方法,而用if判断下,是为了防止self为空的情况,即创建失败的情况。
self被指定为返回值,这个返回值通过self=[superinit]中发送给super对象的init消息得来。
它只意味着在Object-C中我们必须手工调用父类得init方法。
没有对父类的自动调用。
我们必须指定self为[superinit]的返回值,因为它可能会返回nil。
(非常重要的语法知识)
Objective-C创建对象需通过两个消息:
alloc以及init。
alloc的作用是分派存储器空间,init则是对对象做初始化。
init与alloc都是定义在NSObject里的类方法,当对象收到这两个消息并做出正确回应后,新实体才算准备妥当。
-(id)init{
if(self=[superinit]){
}
return(self);
}
父类进行初始化时,用的是子类对象指针self,父类的init方法有可能对这个指针指向的内存区作了大的变更(有可能把这个指针所指的内存释放了,
重新分配了另一块内存区域返回来,这时这个返回的指针与原来的指针是指向不同地址的),所以父类初始化后要重新返回指针。
父类返回的和子类的self的类型都为id类型(通用类型)。
父类的init方法若返回的指针与self不一样,
在父类的init方法中已作了release和新的内存分配,不需要自己再去releasesef,直接用父类init方法返回的指针就可以了。
if(self=[superinit]){}若要超类可以完成所需得一次性初始化
需要调用[superinit]init方法返回得值(id型数据即泛型指针)
描述被初始化对象。
printf("%d",max(a,b));
把max(a,b)作为printf函数的一个参数。
类方法是通过给类而不是对象发送消息来调用的。
下面是一例子:
NSCalendarDate*now;
now=[NSCalendarDatecalendarDate];
+(id)dateWithYear:
(int)year
mouth:
(unsigned)month
day:
(unsigned)day
hour:
(unsigned)minute
second:
(unsigned)second
timeZone:
(NSTimeZone*)aTimeZone
类方法返回一个自动释放的对象。
特别的是,这个类方法使用的参数所指定
的值来创建并初始一个日历数据。
NSCalendarDate这个类,在MAC开发中很常
用。
objective-c中的方法有两种:
类方法和实例方法。
Objective-C利用协议实现回调函数(类似java的回调函数)
在编写iphone开发时,最常用的就是回调函数。
自己编写回调函数,实现动态加载数据,加载完数据之后就利用回调函数通知给前台页面,显示相应数据的界面。
在iphone中利用协议可以很容易的实现回调函数,后台加载数据,然后显示在前台页面。
[font=宋体]
网络的回调函数,如果你指的是-(void)connectionDidFinishLoading:
(NSURLConnection*)connection;
那么只有在全部数据接收完后才会被系统调用
如果你想收到一点就处理一点的话
-(void)connection:
(NSURLConnection*)connectiondidReceiveData:
(NSData*)data;
这个回调能满足你的要求
总之,你先弄明白什么叫回调函数吧。
才能学会调接口,从服务器上取数据,显示到手机界面上。
(非常重要的基础语法知识)
所谓回调函数,是指callback,请先理解。
回调函数的理解
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。
例如Win32下的窗口过程函数就是一个典型的回调函数。
一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。
由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 苹果 开发 重要 语法 知识