基于ObjC的iPhone开发成长记录 2009-04-12 01:26

记下的笔记没带在身边,工作的时候也不能写博客,上网的时间也少,只能慢慢更新了。我也是个新手而已,有错误的地方希望高手指正。此外,因为是在Windows下写博客,有的东西也没查SDK,希望大家多多包涵。

这里也就对Objective-C做详细介绍了,语法是有点奇怪,不过有C和C++基础的基本没问题。

/***********************************************Begin of 2009-04-11**************************************************/

首先写点经常用的到的:

1. ObjC中可以使用标准C++的文件,但是在ObjC中要使用的话请先把你的文件格式改成 .mm 的,不然编译肯定会报一大堆的错误。当然,你如果想在你的类中使用标准C++的类,要么引用头文件,要么就写类前导声明。不过这里要注意的是写法的问题。
例如,@Class MyClass; 大家都知道这个可以用来声明一个ObjC的类(interface),而想声明C++类,那么去掉@符号吧,和你在C++写法一样,Class MyClass; 简单吧。

2. 在ObjC中,类成员属性默认是私有的,想声明为公有,那么就这么写:
@interface MyClass
{
    @public NSInteger iMember1;
    @public NSInteger iMember2;
}
@end
不过要说明的是,就算你写成公有的了,我也没想到用什么办法不通过设置器和访问器直接修改或者读取这个成员,有会的人可以告诉我。

3. 引用头文件的方式,想必大家也知道#import的好处,不过提一点的是,如果你建立文件的时候,这两个文件只是关联的方式存在于你的工程,而存储位置并不是这个位置,那么X-Code说不定就会给你报出一个重复定义的错误的,那个时候先别想其他的,检查工程中的文件有没有少。当然,框架的添加除非必要,一般都是采取关联的方式添加到你的工程中的。

4. 开发中可能会频繁出现的,char *类型和NSString *类型的互相转换,这里介绍两个函数,相信足够大家使用了:
①char *转换为NSString *
+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)encoding
其中encoding是const char *的编码方式,只有知道了这个你才能完成转换
NSStringEncoding种类:
enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding= 65536
};
②NSString *转换为char *
- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding
用法基本同上,相信有了这两个方法,加上你对于C的了解,所有的字符串问题应该不会再困扰你了。

/***********************************************End of 2009-04-11**************************************************/

/***********************************************Begin of 2009-04-16**************************************************/

今天就更新一下今天帮同事解决问题时候的一个小知识点吧:

1. 如果你把类写好了,Outlet也声明了,Interface Builder中的File's owner类型也指定到这个类了,那么当你的控件关联不到那些出口的时候,请注意你的头文件有没有保存,没有保存的头文件是识别不到那些属性的,同样的道理,你指定File's Owner的类型指定不到你写的类的时候也是因为这个问题。

/***********************************************End of 2009-04-16**************************************************/

/***********************************************Begin of 2009-04-19**************************************************/

1. 隐藏状态栏
[[UIApplication sharedAppliaction] setStatusBarHidden:YES animated:NO]
用UIApplication 的sharedApplication方法还可以修改状态栏的其他属性,自己可以尝试,跟系统调用相关联的基本上用的都是这个方法。

2. ToolBar动态按钮的实现
首先,创建按钮,UIBarButtonItem*item = [[UIBarButtonItem alloc] 
                                                                  initWithTitle:@"动态" style:UIBarButtonItemStyleBordered
                                                                  target:self/*决定该按钮事件由谁接受*/
                                                                  action:sel_registerName("fun:")];/*决定接收事件的对象触发哪个动作*/
注意:action是一个sel类型,由sel_registerName(const char*)返回,函数名带参数时不能忘记冒号,本例中fun定义为—(void)fun:(id)sender;
由ToolBar出口[myToolBar setltems:[NSArray arrayWithObjects item1,...]]
至此即可完成动态按钮实现。
如果是要根据动态按钮的sender去判断fun到底执行哪一种操作的话,推荐使用给按钮添加tag的方式,一旦设置了tag之后,随便你想往函数当中传什么参数都变的很简单了,我们在开发中采用的办法是以tag为索引,将其要传入的参数放入一个数组中,然后在fun中使用一个按钮对象指向sender,然后调用其tag指向的数组中的数据就可以了,是不是比你想象的要简单多了。

3. ObjC中类成员变量必须用设置器和访问器才能够设置或者访问该变量。声明属性retain表示为其赋值时retain一次,nonatomic表示不启用多线程特性。

4. 常见调试提示信息:
       “EXC_BAD_ACCESS”属内存泄露问题,如果是标准C中空指针问题,则IDE会指向该位置,如果没有指向,则检查自上一次正确运行以来,添加或修改的代码中release、alloc、赋值数组初始化等容易引起错误的位置;
       “EXC_BAD_INSTRUCTION”错误,检测nib文件中控制与类中输出口关联问题,例如view没有关联,控件关联了不存在的出口或方法等;
       在拥有TableView的类中如果程序在[super viewDidLoad];崩溃,则检查TableView数据源协议中表单元绘制函数里,cell、text显示类型是否NSString类型,image类型是否匹配等等。
       gdb是一个很强大的工具,在Unix下面写C的同志们肯定很熟悉这个工具,这个强大的调试工具同样支持ObjC,并且X-CODE的IDE调试也本就是基于这个工具的,所以放心使用吧!

/***********************************************End of 2009-04-19**************************************************/

你可能感兴趣的:(技术总结,iphone,encoding,interface,fun,工具,action)