对于iOS开发,最重要的就是UIKit了。UI Kit包括类和协议(也就是类似java开发的接口,但是有区别)简单说一下UIKit的里比较重要的类和协议,
1.NSObject类 所有类的根类。所有的UI Kit的类都继承自这个类。看NSObject.h文件,这里只定义了一个isa 指针的成员变量。之一isa是什么?就当成一个名字吧。
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
那么Class是什么呢?看头文件的定义发现Class是这样的。Class是一个结构体。
至于结构体的各变量的含义,开始学的时候也不需要整明白,慢慢去理解吧。
//一个不透明的类型 代表一个Objective-c类
typedef struct objc_class *Class;
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols BJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
然后是NSObject的方法(其实好多方法是值得仔细分析的,暂且不分析,后面我会慢慢总结)
+ (void)load;
//两个初始化的方法,一个类方法,一个实例方法。
+ (void)initialize;
//实例话对象
- (instancetype)init;
//创建对象也可以用 new
+ (instancetype)new;
//和copyWithZone一样官方的解释是
//This method exists for historical reasons; memory zones are no longer used by Objective-C.
+ (instancetype)allocWithZone:(struct _NSZone *)zone;
//初始化类时调用alloc来分配内存空间
+ (instancetype)alloc;
//使用ARC之后不再使用这个方法,(之前是销毁对象)
- (void)dealloc;
- (void)finalize;
//copy会拷贝一份该类的引用
- (id)copy;
//和上面类似
- (id)mutableCopy;
//同allocWithZone类似但是没有仔细分析过
+ (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
+ (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
//下面这些方法没有接触过,暂时解释不了。
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
+ (BOOL)conformsToProtocol:(Protocol *)protocol;
- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
- (void)doesNotRecognizeSelector:(SEL)aSelector;
- (id)forwardingTargetForSelector:(SEL)aSelector __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
+ (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector;
- (BOOL)allowsWeakReference UNAVAILABLE_ATTRIBUTE;
- (BOOL)retainWeakReference UNAVAILABLE_ATTRIBUTE;
//返回是不是一个类的字类的真假值
+ (BOOL)isSubclassOfClass:(Class)aClass;
//这两个暂时没接触
+ (BOOL)resolveClassMethod:(SEL)sel __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
+ (BOOL)resolveInstanceMethod:(SEL)sel __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
+ (NSUInteger)hash;//返回一个hash内存地址
+ (Class)superclass;//返回该类的父类
+ (Class)class;//返回该类的类名
+ (NSString *)description;//类似java的类的toString方法
+ (NSString *)debugDescription;
NSObject的协议(接口)
//下面是NSObject.h文件中对协议的一些声明
@protocol NSObject
// 判断是否是同一个对象
- (BOOL)isEqual:(id)object;
@property (readonly) NSUInteger hash;
@property (readonly) Class superclass;
- (Class)class;
- (instancetype)self;
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
- (BOOL)isProxy;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
//在非ARC环境下使用的四个方法,
- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
//不能在ARC环境下使用,返回一个zone的结构体。
- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
@property (readonly, copy) NSString *description;
@optional
@property (readonly, copy) NSString *debugDescription;
@end
2.第二个比较重要的类就是UIResponder,字面的意思就是响应类,也就是用户操作手机的所有的响应时间都与他有关,触摸,滚动,点击等,但是对于我这个初级学习者来说似乎这个类游戏抽象,而对于我们来说他的几个子类才是最重要的,UIApplication,UIViewController,UIView及UIView的子类UIWindow,
3.UIApplication是一个程序里最重要的类。因为程序的入口就在这里。官网的文档对他的解释是
The UIApplication
class provides a centralized point of control and coordination for apps running on iOS. Every app must have exactly one instance of UIApplication
(or a subclass of UIApplication
). When an app is launched, the UIApplicationMain
function is called; among its other tasks, this function creates a singletonUIApplication
object. Thereafter you access this object by invoking the sharedApplication
class method.
//大概意思是说,每个App必须有一个UIApplication的实例,当app被运行,UIApplicationMain()方法被调用,UIApplication是单例的,使用它的类方法shareApplication()获取一个单里的UIApplication实例。虽然UIApplicationMain()并不是UIApplication的方法或协议方法,但是在UIApplication.h 文件里能找的这个方法,
UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
//UIKIT_EXTERN 是定义的一个宏,再往里就看不到了,按字面意思是说UIKit外面的一个默认值(纯字面翻译)
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
UIApplication的代理方法(准确的应该叫UIApplicationDelegate,一般的代理名称后边都加
Delegate,但是NSObject除外
)
它代理方法很多,最常用的也就是创建项目时自动生成的六个,
4,UIViewController,一般称为控制器。通俗的讲,一个应用要想显示在手机屏幕上,必须把显示的东西(view,也叫视图)加载到控制器中,然后再显示出来。
总之一定要记住,视图应该放在控制器里,而控制器就是我们要操作的页面,一般一个屏幕代表一个控制器(ipad可以有多个)。但是一个控制器不一定只有一个屏幕,例如导航控制器,可以通过一个界面,进入另外一个页面。虽然切换可屏幕但是它们的控制器还是一个。而在这个控制器里所有的视图控件都归这个控制器管理,控制器销毁是说有的视图也就销毁了。说到这里不得不说一下UIWindow,这个类的对象就是代表当前手机屏幕的一个窗体。有控制器还不行,得把控制器交给当前的窗体才能显示出来。再UIApplication.h文件中可以看到UIWindow时,UIApplicationDelegate的一个成员变量。
@property (nonatomic, retain) UIWindow *window NS_AVAILABLE_IOS(5_0);
//显然该属性具有set,get方法,所以他的子类就可以设置windowd的各属性。window有个属性是 UIViewController *_rootViewController;
设置根控制器,将我们要显示的控制器设置为rootViewController(Storyboard设置的默认启动控制器就是根控制器),启动应用程序后,欢迎页面过去,显示的就是我们的第一个控制器及其包含的内容。当然,还可以切换根控制起。如果有别的控制器。当把控制器设置为新的控制器时。旧的控制器也就随之消失。手机屏幕显示的页面为新控制器的页面。
5.UIView应该是我们接触最多的类了。常用的控件的类几乎都是他的子类。初级需要了解的也就下面几个了。理清楚每个类的属性方法之后。做起页面会游刃有余(我也不是一开始就细看这些类,是边做边看,然后再边看边做,螺旋式学习)
UIView
创建这些的类的实例后将这些对象实例添加到ViewController中就可以了(我指的是手写代码,用storyboard直接拖就可以,)。
但是有几个特别注意的一点。
(1),创建完对象后一个要设置位置和大小,程序不知道你的view多大,再什么位置。坐标(0,0)点在手机屏幕左上方,相对那个点来设置。还有就是有些系统定义好的控件可能不需要设置大小,这个具体问题具体分析。
(1),创建完对象后一个要设置位置和大小,程序不知道你的view多大,再什么位置。坐标(0,0)点在手机屏幕左上方,相对那个点来设置。还有就是有些系统定义好的控件可能不需要设置大小,这个具体问题具体分析。
(2),一定要将创建的控件加到ViewController中,[self.view addSubView:XXX],
(3),然后再做一些其他的工作,比如设置字体大小,背景颜色,内容什么的。
做完这些之后一定要跑一下程序。测试成功后就可以开始干活了。然后下一篇就开始创建第一个页面了。(我写的基本上时手写代码的模式开发的,storyboard我觉得会代码开发之后那个应该也很容易了)。
有不正确的地方希望有人指正。谢谢