iOS学习之路-02-创建页面前的思考

对于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)点在手机屏幕左上方,相对那个点来设置。还有就是有些系统定义好的控件可能不需要设置大小,这个具体问题具体分析。
(2),一定要将创建的控件加到ViewController中,[self.view  addSubView:XXX],
(3),然后再做一些其他的工作,比如设置字体大小,背景颜色,内容什么的。
做完这些之后一定要跑一下程序。测试成功后就可以开始干活了。然后下一篇就开始创建第一个页面了。(我写的基本上时手写代码的模式开发的,storyboard我觉得会代码开发之后那个应该也很容易了)。
有不正确的地方希望有人指正。谢谢


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值