初学Objective-C语法

先自我介绍下吧,我09年接触iOS开发,10年开始第一份正式的iOS开发的工作,算下来有5、6个年头了,接触过社交、工具、电商、阅读等类型的应用,但是….到现在为止竟没有一个正式的博客,也算是够懒的了。好吧,今天开始准备把之前积累的一些经验分享出来。希望大家给点掌声👏👏👏👏,谢谢~

本人是从C++转向iOS开发的,所以先谈谈刚接触iOS开发容易犯的几个错误:

1.  Objective-C的语法问题

    OC采用的语法跟C++很不一样,初学时最容易搞错的就是语法了,我是花了两天的时间才习惯过来。C++ 采用的是. 和->来作为变量或属性的连接符,而且可以多个函数或者属性连续调用; 而OC中方法调用方法是用[],调用的对象和方法之间用空格分开,.是用来调用属性的。举个栗子来说,要让对象a调用print方法,print方法有一个参数,是一个字符串test,那么 C++的写法是这样的:

     a.print(“test”);

而Objective-C是这样的:

    [a print:@”test”];

如果print方法是a某个公开的成员变量m_aaa的方法,那么C++是这样写的:

    a.m_aaa.print(“test”);

或者 

   a->m_aaa.print(“test”);

而Objective-C是这样的(Objective-C中没有公开的成员变量,类似的变量叫做属性):

   [a.m_aaa print:@”test”];

怎么样,是不是很容易搞混淆?

2. 再说说属性和成员变量的区别

Objective-C中有两种变量,一种叫成员变量,写在@interface {} 里面

@interface XXXViewController :UIViewController {

NSArray*m_array;

}

这种跟C++是一样的,只是C++有public,private,protected之分,而OC中没有这些修饰符,OC中的这种变量如果是写在头文件中泽默认是protected的,如果是写在m文件中则是private的。(OC中也有@public关键字,不过好像并没有什么用)

另一种叫属性,是写在@interface {} 外面的,类似于C++中的公有的成员变量,可以被对象外部访问

@property NSArray *array;

(其实,还有一种匿名类别中的属性,是不可以被对象外部访问的,这里为了避免混淆,先不介绍了)。编译器会将属性自动展开为一个带下划线前缀的同名的成员变量,并为其添加set 和get 方法,也就是说,你定义了一个名为array的属性,编译器会生成一个_array的成员变量,并生成了两个方法:

-(NSArray*)array;   

以及 -(void)setArray:(NSArray*)array; (这里遵循Cocoa命名的驼峰原则,第一个a大写了)

在Xcode6之前,要展开一个属性是需要在m文件中给属性添加@synthesize 关键字的,Xcode6之后不需要了,算是编译器的一个优化。

3.判断两个对象是否相等

   跟很多语言不同的是,OC中不能直接用==来判断两个对象是否相等,而是通过一个函数isEqual: 来判断(这点跟C++倒是一样),因为==判断的是对象的指针,而非对象的内容。但是判断对象是不是为空(nil)是可以直接用== 来的。不同类型的对象是不能判断是否相等的。

判断字符串是否为空也可以通过字符串的length属性是否等于0来判断,比如说要判断一个字符串obj是否为空,可以用 [obj isEqual:@””],或者obj.length == 0。 后台说的字符串为空一般是指@””, 而OC中的空是指nil, 如果在工作中你经常跟后台调试http接口的话,就要特别注意这一点。

4. 数据存储

iOS中有一个沙盒的概念,应用程序产生的数据只能存到对应的沙盒中,所谓沙盒就是一个限制了访问权限的文件夹,应用程序彼此之间不能相互访问(除非提供扩展,或者系统应用访问你的程序),以最大程度的减少数据污染和泄漏的可能性。应用程序有几个常用的文件夹:Document、 Temp、 Cache , 其中Document用来存用户自己创建的数据,这种数据一般比较重要,属于不可再生的,开启了iCloud之后可以被系统自动备份到云端;Cache和Temp用来存临时的数据,比如HTTP缓存,或者下载的图片等;  

另一个值得注意的问题就是数据库的访问。可能是因为之前写windows客户端经常用mysql的缘故吧,我还天真的以为iOS程序可以直接访问mysql,于是从网上下了一个mysql的库,本地建好了表,还写了一些SQL语句,等真正运行的时候发现编译出错,才知道原来iOS根本不支持mysql。 iOS本地支持的数据库只有sqlite,这个东东可以认为是一个单机版的mysql,语法跟mysql差不多,Cocoa SDK中有一套API可以操作他,但是非常难用,一般都会使用FMDB等第三方的代码库来操作。至于为什么iOS不能支持mysql,我到现在也没搞明白,可能mysql是分布式的吧。

    原文作者:FingerStyle
    原文地址: https://www.jianshu.com/p/9c4059d81d72
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞