语法,学习资源

来源:互联网 发布:电棍专卖网淘宝 编辑:程序博客网 时间:2024/06/01 10:33
1.Objective-C是扩充C的面向对象编程语言,简写为ObjC或Obj-C。
  #import 相当于 C/C++ 语言中的 #include #pragma once
  Objective-C 中函数缺省的就是 virtual 的。
  继承的时候没有限定符,继承都是 public 的。
  @interface中成员变量缺省是@protected,而函数是 public 的。
  Objective-C 与 Java 语言一样,都是单一继承,只有一个父类。
  类变量在实现文件中定义,例如 static MyClass* sInstance = 0; 并且只在当前定义文件中有效.
  id是指向struct objc_object的一个指针,id是一个指向任何一个继承了Object(或者NSObject)类的对象,更多可以查看objc.h。
  object-c中不存在真正的私有方法,也无法把某个方法标识为私有方法禁止其它代码调用。这是objective-c动态本质的副作用。
  Objective-C中,类的实例化变量的范围有@private、@protected、@public。他们代表的意思和C++中相同,只是前面添加了一个@符号。
  不象C++,Objective-C没有真正的私有或保护的方法

  release的常用写法:release和nil写在同一行,使用逗号操作符,例如 [memCache release], memCache = nil;
 


2.符号
   @dynamic    不自动生成,由开发人员手工提供getter,setter方法。
   @synthesize 在开发人员没有实现setter,getter方法时,编译器自动生成相应的代码。
      nonatomic,即non atomic,非自动.它与@synthesize一起使用才有意义。
      atomic的意思就是setter/getter这个函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样。
      nonatomic不保证setter/getter的原语行,所以你可能会取到不完整的东西。
      如果不需要多线程支持的话,当然nonatomic就够用了,另外由于不涉及锁操作,所以它执行相对快点.
      默认情况,所有的synthesized setters 以及 getters 都是原子性的,都使用了同步方法。所以除非确实需要原子性,否则都将属性声明为nonatomic。
      另外,readwrite也是特性的默认属性,所以通常不会使用这一属性.

3.nil
   在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。nil调用方法,不会产生
crash或者抛出异常。
   但是对于我们来讲,最主要的就是我们不用在调用一个对象的方法之前检查该对象是否为空。如果你调用了一个nil对象的方法并且该方法
有返回值的话,你会得到一个nil返回值

4.一些头文件
   在NSObjCRuntime.h头文件中定义了一些宏,如MIN,MAX,ABS,M_PI。
 
5.重载
   objective-c中的函数重载可能与一般的重载限制不同,
   在只有参数类型不同的重载时,编译报错。或者可以理解为这里不允许重载,当参数描述不同时,函数名就已经不同了,就不属于重载了

   但类方法和实例方法可以有相同的名字而又有不同类型的参数和返回类型,因为它们不在同一张dispatch table中。
 
6.可以将对象分为id类型(动态类型)和静态类型,在其他面向对象编程语言中,动态类型有时被成为弱类型,静态类型被成为强类型。
   如果不涉及到多态,要尽量使用静态类型,静态类型可更好的在编译阶段报出错误,静态类型相比使代码可读性更强.
   编写 Objective-C 代码,参考 http://www.guomii.com/posts/22764
 
7.有关类的判断的方法.
  isKindOf, isMemberOf, respondsToSelector,  instanceRespondsToSelector, isSubclassOfClass, performSelector,
  使用类名或对象发送class消息,可以生成class-object类结构指针,可以这样判断两外对象是否在同一个类if([obj1 class]==[obj2
class]).

  实例化类的另一种方式:vs = [[NSClassFromString(@"VSSpeechSynthesizer") alloc] init];
  NSStringFromClass方法很有用,从类得到类名,NSStringFromClass([obj class])


   respondsToSelector:返回是否实现或继承了某方法,包括继承了协议但没有实现的情况。

  不能用来判断super, 因为这样最终还是判断了当前类。使用以下的方法判断父类:

if( [父类名 instancesRespondToSelector:@selector(aMethod)] )

{
    // invoke the inherited method
    [super aMethod];
}

 

 8. 在类方法中也可以使用self.    实例方法里面的self,是对象的首地址。应该被翻译成为object self.

    类方法里面的self,是Class,可以翻译成class self;
    在实例方法中,不要用self调用类方法。 
    在类方法中,更不能用self调用实例方法。
    在中间基数中调用[super fun]不会调用到子类中重写的fun。若要调用到子类中重写的fun,要使用[self fun]形式调用。这个问题在init构造方法中常遇见。


注意:通常,在重写的默认的初始化方法-(id)init中,不应该调用除了[super init]以外的方法。如果必须在类的初始化方法中调用像[super initWith…]这样
的方法,应该将初始化方法命名为类似于-(id)initWith…这样的格式。因为-(id)init这个方法是默认的初始化方法,它最终会被任何特殊的初始化方法(比如initWithFile)所调用。因为上述代码又调用了[super initWithFile:..]这个特殊的初始化方法,最终产生了一个死循环。

测试过只要不调用[self init],只调用[super init],就不会死循环,但最好遵守上面的规则。


  
9. de facto standard,也就是潜规则.
    大多数情况下,请不要破坏潜规则,不可以把访问私有变量和函数当作一种乐趣
 
13.类型 void(^)(void)  表示要接收一个块(Block), 块可以理解为一个函数对象,相当于函数指针,void(^)(void)表示这个函数对象没有返
回值也没有参数。
 
14.静态成员变量
    和c++不同,objective c不支持类静态成员变量(也就是不支持class variables),通常的做法是在class之外定义静态变量来代替.
 
15. 除了面向对象的cocoa,iphone编程不要忘记非面向对象的Core Foundation。 面向对象库里很多没有的功能,可以尝试在Core
Foundation里找找。如:RSA算法,MD5算法,SHA1算法,AES加密算法等,cocoa对象库里并没有相应的实现,但在core foundation里,均有
相应的实现。NSString类里没有的字符串编码GBK,GB2312,GB18030等,在 CoreFoundation里,能找到相应的编码。建立socket连接,获得
输入流和输出流时,也需要使用Core Foundation里的CFNetwork api。
   
16.object-c与C++的差异
     C++里的多重继承、命名空间、运算符重载、模板、类变量、抽象类、STL 等概念在objc中没有,但是ObjC中都有相关的特性和技术用于替代或者模拟这些特性。
     C++与 ObjC 最大的区别在于分配方法的机制不同:C++是基于虚拟表机制确定虚函数调用什么代码;ObjC使用运行时,函数进入各种类结构中查找相应的代码以供调用。 C++的效率要高的多,ObjC 牺牲了一定的速度和安全换来了灵活和便捷,这是一种权衡利弊的做法。
 

17.属性:
     Objective-c中的属性在第一次使用时,会创建实例,此时,如果这个实例是可修改的,则可直接调用它的其它init方法;如果它不是可修改的,必须赋值进行修改。
     例如 UIViewController子类中的代码:

 self.title = [NSString stringWithFormat:@"%d%%", brightness * 10];


 [self.tabBarItem initWithTitle:self.title image:nil tag:0];

编译器生成存取方法只会在已编译的代码中进行,不会改动源代码文件。

   属性重写:在子类中把基类中不可写的属性重写为可写,但这样做是危险的,往往设计出了问题。

   例如在UIViewController中,

  @property(nonatomic,readonly,retain) UINavigationController *navigationController;

变为@property(nonatomic,retain) UINavigationController *navigationController;

  @property(nonatomic,readonly) UIViewController *parentViewController;

变为@property(nonatomic) UIViewController *parentViewController;



18.enum 枚举

http://www.cnblogs.com/54007/archive/2011/02/12/1952370.html


17.使用可变参数的示例:
#import <stdarg.h>
+ (void) say: (id)formatstring,...
{
 va_list arglist;
 va_start(arglist, formatstring);
 id statement = [[NSString alloc] initWithFormat:formatstring arguments:arglist];
 va_end(arglist);
 [ModalAlert ask:statement withCancel:@"Okay" withButtons:nil];
 [statement release];
}

19.Apple 开发人员联盟,在网站地图中找。
   http://www.apple.com.cn/developer/
   官方在线代码样例:
   http://developer.apple.com/library/ios/navigation/  左侧Resource Type中有sample code,也可以在联机文档的首页中找,提供了open project in xcode按钮。
 
21.混合使用c++文件

     在xcode工程中,使用cpp文件或c++代码的objective-c源文件要写为.mm后缀,在mm文件中包含c++头文件一样可以使用#import,在mm文件中可以同时写objective-c和c++代码。

     c++的class定义实现写在cpp中,它的头文件只能被.mm文件包含使用,然后.mm文件可以再被其它.m文件使用。


23.protocol
    protocol机制被称为正式协议(formal)
标准写法
@protocol XXDelegate <NSObject>
 @optional //默认为@required
 ...
@end
可以继承一个protocol,如上面的继承了NSObject protocol。
若调用optional方法时,最好在代码中先判断该方法是否存在,再调用。
在消除某个对象时,如果为该对象设置了delegate,则需要先将delegate设成nil,这是一种良好的代码习惯。
可以用一个delegate来表示两个代理,语法如下: id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

25.类别,category机制被称为非正式协议(informal)

     Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。

     可以在@implementation中以类别的形式定义一些方法,把这些方法看成是私有方法,仅在类的实现中使用。但这只能在声明中隐藏此方法,不能阻止从该实现之外访问这些方法。
     添加init类别时,调用原有的init方法,要用[self init],而不是用[super init],因为这里不是继承。

     设置私有属性,在.m文件中增加类别

@interface FormFieldViewWrap(private)


@property (nonatomic,retain) NSString* iValue;


@end

但不能起别名。

注意:1) 不能增加数据成员

           2) Category可以重写原始类的方法,这样会覆盖掉原始类的方法,不推荐这么做。如果确实要重写,那就通过继承创建子类来实现。

           3) 如果一个类的多个category都定义了同名方法,那么在调用时不确定会调用哪个。

在编译后确实会出现如下覆盖警告

           Instance method 'initWithFrame:cancelButtonImage:' in category from .../Debug-iphonesimulator/TianyaQingV2.build/Objects-normal/i386/CancelableProgressView+Category.o overrides method from class in .../Debug-iphonesimulator/TianyaQingV2.build/Objects-normal/i386/CancelableProgressView.o



       去掉警告 Category is implementing a method which will also be implemented by its primary class

     A category allows you to add new methods to an existing class. If you want to reimplement a method that already exists in the class, you typically create a subclass instead of a category.

#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"// do your override#pragma clang diagnostic pop

 

27.更多资源

     在线文档 http://developer.apple.com/library/ios/navigation/index.html ,在Documents输入框中搜索。

iPhone 应用程序编程指南 http://www.apple.com.cn/developer/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html
http://www.dreamingwish.com/
http://zhaohaiyang.blog.51cto.com/2056753/d-9
源码
http://code4app.com/
iPhone开发入门(7)--- 从C/C++语言到Objective-C语言
http://www.yifeiyang.net/iphone-development-introduction-7-from-the-c-c-language-to-objective-c-language/


28._cmd关键词是所在当前方法的缩写, 它对应 @selector(selfmethod)



29.

1.历程:
1977年Apple II样机出现在美国第一次计算机展览会上。3年会苹果顺利上市。
1998年苹果推出了一体化结构的iMac电脑,它摒弃了软驱,首次推出了USB连接口。它使苹果重新恢复了盈利。
2001年苹果推出了iPod音乐播放器。它是苹果第一款大范围取得成功的产品,随着2003年iTunes音乐商店上线,苹果超越了沃尔玛,统治了mp3音乐市场70%的份额,成为全球最大的音乐零售商。
2001年苹果推出了Mac Os X个人电脑操作系统。它以界面华丽,操作人性化著称。
2006年苹果推出了采用英特尔新处理器的MacBook,它以时尚简洁,功能强大,电池续航时间长闻名。
2007年苹果推出了iPhone手机,使用了经过简化的Mac Os X操作系统。至2010年6月,全球售出超过6000万部iPhone。
2010年苹果推出iPad。
2.iPhone
背面:1代的iPhone为金属铝壳,3g,3gs为弧形的特殊塑料,iPhone4换成了强化玻璃。
cpu:iPhone的核心芯片简称为A4,由苹果公司研发。iPod也采用该芯片。它内部集成了cpu,gpu,i/o,ram.主频1G,内存256M,它的整体表现惊人,待机时间300小时,音乐播放30小时,视频播放10小时,2G通话14小时,3G通话7小时。
三轴陀螺仪:感应3个维度方向的变化,比重力感应更加敏感。
3.白苹果
解决白苹果的方法主要有两种:恢复iPhone;修改plist文件。
 
 
 
 
 
不开放蓝牙:不支持文件传输,只支持跟蓝牙耳机配对和进行某些游戏的联机对战。
无内存卡插槽;只有机身内存。
不能换电池;
版权问题;
整体设计需要:厚度,美观,功能是否必须等。
没有MMS,不能直接发送联系人号码,内置蓝牙只能用单声道耳机;
你开个饭店,顾客都自己带东西进来吃,你高兴吗?
数字音乐版权上,不允许用户拷贝;
老乔的经营理念是引导消费,而不是满足消费。就是他画个圈,让你在里面耍;
SD卡速度是有限制的...很慢;
iphone没有内存卡,它是机器自带的内存。下载安装iTunes连接iphone就能看到里面的歌曲,照片了。
越狱,获取底层操作权限;(相关问题对新手来说极其复杂)
安装WinSCP,或者91手机助手。都有文件管理能力。过上述软件管理iphone的存储空间,可以上传下载。

IDP:iphone developer
iPhone Developer Program
- Individual
$99 /Year

iPhone Developer Program
- Company
$99 /Year

iPhone Developer Enterprise Program
$299 /Year

iPhone Developer University Program
Free
299刀的可以开发企业内部应用给员工每人装一个,不用通过上传到app store ,(in house distribution )。
99刀的公司版跟99刀个人版唯一的区别是,公司版可以开通很多个开发人员账号,他们自己上去申请证书,建App ID之类的,但是最后上传程序的还是只有一个人可以。个人版只有一个账号,没有子账号。
99的公司版要传真传真公司的营业执照等,有不同的申请流程。
如果不想發布到 App Store, 可以選用 iPhone Developer Enterprise Program, 但只接受有 500 名員工的企業申請...
You must be a company or organization with 500 or more employees and a DUNS number to apply.
http://www.cocoachina.com/bbs/read.php?tid-22373.html
1. ASIHTTPRequest :ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度跟踪,上传文件,HTTP 认证...
iOS5增加了锁屏拍照、推送通知等众多新功能。iOS 5新增约1500个API ,为用户带来超过200个新特性,在2011年秋天开放下载。支持3GS、iPhone 4、iPod Touch 3/4、两代iPad。。
 iOS 4引进了多任务可以让程序运行于后台,不过对目前大部分程序而言这只是一个鸡肋。如果想按下Home键后像iOS 4之前一样直接退出方法如下:打开info.plist,加入 UIApplicationExitsOnSuspend 或者选择“Application does not run in background(程序不运行于后台)” 将其设为 YES 。
苹果iPhone4多任务详解
http://nning.net/nn300
在目前,除了系统自带的几个应用可以利用如上方法进行相互切换外,(天气、短信、记事本等),大量的第三方程序其实并不能利用这个方式来进行多任务之间的切换。而其目前的效果,不过是将这些使用过的程序以图标的方式进行了记录.
且旧版本软件在iphone4中仍不能在后台运行。
 
如何从PC中彻底卸载iTunes
如 果想要将iPhone从3.X固件降级到2.X固件,那么你需要将您电脑上的iTunes完全删除并重新安装7.5版本的iTunes,由于iTunes 中涉及到多个相互依存的组件,因此请按照以下顺序,在"控制面板"->"添加或删除程序"中卸载iTunes和相关组件:
1、iTunes
2、QuickTime
3、Apple Software Update
4、Apple Mobile Device Support
5、Bonjour
6、Apple Application Support(iTunes 9 或更高版本)
注意:如果卸载顺序不同,或仅卸载某些组件,则可能会看到各种警告信息。完全卸载完毕iTunes及其组件后,请重启电脑再进行其他操作。
还有一个比较方便的方法就是利用360卫士或者金山卫士中的软件管理将以上软件逐一卸载,再重启电脑即可。
 
1.设置-通用-关于本机-调制解调器固件就是通常所说的基带baseband
2.固件可以单独升级。如果升级带的话 固件也会一起升。也就是说固件可以单独升 基带不可以单独升

基带(Baseband)是手机中的一块电路,负责完成移动网络中无线信号的解调、解扰、解扩和解码工作,并将最终解码
完成的数字信号传递给上层处理系统进行处理。
在我们的手机中通常由两大部分电路组成,一部分是高层处理部分,相当于我们使用的电脑;另一部分就是基带,这部
分相当于我们使用的Modem,手机支持什么样的网络制式(GSM、CDMA、WCDMA、TD-SCDMA等)都是由它来决定的,就像
ADSL Modem和普通窄带Modem的区别一样。
我们用手机打电话、上网、发短信等等,都是通过上层处理系统下发指令(通常是标准AT指令)给基带部分,并由基带
部分处理执行,基带部分完成处理后就会在手机和无线网络间建立起一条逻辑通道,我们的话音、短信或上网数据包都
是通过这个逻辑通道传送出去的。
而随着软件无线电技术的发展,现在手机中的基带部分基本上都可以利用软件来实现无线信号的解码工作,同时采用软
件无线电技术可以方便的实现基带部分的升级,以满足不同的需要或是修正基带部分的BUG。
DEV TEAM所作的工作就是要破解高层系统与基带部分的通信,以便高层指令能够穿透苹果的限制,直接送达基带部分,
以完成通信。

苹果 iOS SDK 开发
http://blog.sina.com.cn/iphonesdk

拾豆网是一个移动开发者社交网络
http://www.ctolive.com/ 其中有一些发布的开源工程
iPhone人机界面指南
http://www.apple.com.cn/developer/iphone/library/documentation/UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html
iOS Human Interface Guidelines
http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html


#ifdef RECORD_LOG
    #define numberOfRowsInSection3 3
#else
    #define numberOfRowsInSection3 2
#endif 结束使用#endif,不是#end

工程编译生成的内容存在 /Users/gzty1/Library/Developer/Xcode/DerivedData 下对应的工程目录中.
 
单例:SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);
定义:
#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \
\
static classname *shared##classname = nil; \
\
+ (classname *)shared##classname \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [[self alloc] init]; \
} \
} \
\
return shared##classname; \
} \
\
+ (id)allocWithZone:(NSZone *)zone \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [super allocWithZone:zone]; \
return shared##classname; \
} \
} \
\
return nil; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
} \
\
- (id)retain \
{ \
return self; \
} \
\
- (NSUInteger)retainCount \
{ \
return NSUIntegerMax; \
} \
\
- (void)release \
{ \
} \
\
- (id)autorelease \
{ \
return self; \
}
 
另外,由于apple在设计的时候,其实appdelegate本身就是一个singleton模式,在整个project中,可以通过访问delegate来控制project里面的数据访问。
 
Objective-C的单例模式(singleton),详细阅读:
http://blog.sina.com.cn/s/blog_4cd8dd130100tivo.html

 iphone开发资源汇总
http://blog.csdn.net/favormm/article/details/6664970
各种效果的ios代码示例:
http://code4app.com/ios/UIView-Transition/4f67f9786803fa843f000003

100.from xcode4.4 objective-c 新特性
http://www.cocoachina.com/newbie/tutorial/2012/0802/4522.html


101.ios6

属性可以是是自动合成的,在属性名称前添加下划线即可。使用这种方式自动创建的实例变量是该类所私有的,甚至其子类都无法直接访问这种实例变量。



原创粉丝点击