浅谈——location

今当上班的下遇到了一旦因不同之页面随机添加栏目的题目,很简短的问题,想到了判断页面url是否包含某字符串来开展任意添加栏目、。。这就是得了解location对象。

接口与 API 设计

location

第 15 长条:用前缀避免命名空间冲突

  1. 假若发命名冲突(naming
    clash),那么应用程序的链接过程就是见面出错,因为起了双重符号。
  2. 应吗拥有名称都加上适量的前缀,最好是三单字母以上做前缀,因为苹果宣称该保存下有
    “两许母前缝”。
  3. 于接近的兑现公文所有的纯C
    函数和全局变量,也是爱命名冲突之,在编译好之靶子文件被,这些使算是做
    “顶级符号”(top-level symbol)。
  4. 苟自己之代码准备再次宣布为次供他人付出应用程序所用,自己之代码和自己引用到的老三方库都是如加前缀的,避免以未来冲突。
  • 选料与公的号、应用程序或双边均有关联的名作为类名的前缀,并在颇具代码中均使用就同样前方缀。
  • 倘若自己所支付之程序库中因故到了第三方库,则应为其中的称谓加上前缀。

属性名

第 16 长达:提供 “全能初始化方法”

  1. “全能初始化方法”(designated
    initializer):为目标提供必需信息以便其能不辱使命工作之初始化方法。
  2. 每个子类的全能初始化方法还应当调用其超类的相应措施,并逐层向上。
  • 当接近中提供一个全能初始化方法,并被文档里指明。其他初始化方法皆允诺调用此方法。
  • 使全能初始化方法以及超类不同,则需要覆写超类中的照应措施。
  • 若果超类的初始化方法不适用于子类,那么相应覆写这个超类方法,并在内部抛来老。

属性说明

第 17 条:实现 description 方法

  1. 在调用NSLog(@"object = %@",onbject); 其实是调用了靶的description
    方法。
  2. 每当咱们于定义类中,这样子打印输出信息发生或是这种object = <EOCPerson: 0x7hh9j22238800>
    ,这个我们用再行写description 方法,让它们回到我们得之一对信。
  3. description 定义在NSObject 协议里,因为NSObject 不是绝无仅有的
    “根类”,用连续不能够充分好的于任何类有这个法子,例如:NSProxy
    也是依照从了NSObject 协议的 “根类”。
  4. 有点技巧:可以于description 中用NSDictionary 的description
    方法来输出,就是拿信息之所以字典的样式来显示,这样子更加直观,也进一步便于扩展。
  5. debugDescription
    方法是开发者在调试器中盖控制高命令打印对象时才调用的,默认是直接调用description
    方法。po object;
  • 贯彻 description 方法返回一个起含义之字符串,用以描述该实例。
  • 假若想以调试时打印出再详细的对象描述信息,则应促成debugDescription
    方法。

hash

第 18 漫漫:尽量以不可变对象

  1. 设计类的时节,用性来封装数据,在用性的早晚,可将那宣称也 “只读”
    ,避免外部不必要之修改(PS:如果拿可易对象放置collection
    之后同时修改该情,很易会毁掉set
    的其中数据结构,使其夺原来之语义)。
  2. 尽心尽力把对外公布出来的属性设为特念,而且才当委有必不可少时才将属性对外宣布。
  3. 当我们纪念外部暴露只读属性、内部用改属性,这样子通常是在中以readonly
    属性重新声明也readwrite。但是倘若该属性是nonatomic
    的,这样子做或会见起 “竞争原则”(rece
    condition)。在对象中写副某属性时,对象外的观察者也许正读取该属性。若想避免这个题材,我们可以在必要时经
    “派发班”(dispatch
    queue)等招数,将持有的数码存取操作都设为同步操作。
  4. 则属性对外设置成readonly 了,但是表面仍会由此
    “键值编码”(Key-Value
    Coding�,KVC)技术设置这些属于性值。[object setValue:@"abc" forKey:@"name"]
    ,这样子可以修改name 这个特性,KVC 会在相近吃搜索 “setName:”
    方法来窜属性值。
  5. 尚可以通过类型信息查询功能,查出属性所对应的实例变量在内存中之偏移量,从此来人为设置这个实例变量的值。
  • 尽量创建不可变的对象。
  • 假使有属性仅可为对象中修改,则在 “class-continuation 分类”
    中将那由readonly 属性扩展成readwrite 属性。
  • 绝不拿可变的collection
    作为性能公开,而应提供有关方,以此修改对象被的可变collection。

装或返回从井号 (#) 开始的 URL

第 19 条:使用清晰而协调的命名方式

方及变量名叫使用
“驼峰式大小写命名法”:以小写字母开头,其后每个单词首许母大写。类名也采取驼峰式命名法,不了那个首字母需要大写,通常还会见加两三独前缀字母。

主意命名

- (id)initWithWidth:(float)width andHeight:(float)height;
  1. 管办法名起的稍微长一点,可以确保其会确切传达出方所执的天职,但是也未能够累赘,尽量简单。
  2. 分明的计名从漏洞百出至右读起来好似一篇稿子,易于维护,他人吗愈加容易掌握。
  3. NSString 这个近乎即显了同拟好的命名习惯,可以错过查下文件。
  4. 深受艺术命名总结:
    • 若措施的返回值是初创办的,那么方法名之首个词应是返回值的种,除非前面还有修饰语,例如localizedString。属性之存取方法不依照这种命名方式,因为相似认为这些办法无会见创新对象,即便偶回来内部对象的一样卖拷贝,我们呢道那一定给原始的靶子。这些存取方法应该按照其所对应的特性来定名。
    • 相应将象征参数类型的名词放在参数前面。
    • 如艺术要在现阶段目标及推行操作,那么即使活该包含动词;若实行操作时还需参数,则当以动词后面长一个或多只名。
    • 永不采用str 这种简称,应该使用string 这样的完备。
    • Boolean 属性应加is 前缀。如果有艺术返回非属性的Boolean
      值,那么当依据其力量,选用has 或is 当前缝。
    • 以get 这个前缀留给那些借由 ”输出参数“
      来保存返回值的计,比如说,把返回值填充到 ”C语言式数组“
      里的那种方式就可使用这个词做前缀。

类及商的命名

  1. 有道是也接近及协商的名目加上前缀,以避免命名空间冲突。
  2. 取名该协调一致,从任何框架继承子类,务必以其命名惯例。UIView
    子类末尾必须是View,委托协议最后必须是Delegate。
  • 起名时承诺照从正规的Objective-C
    命名规范,这样子创建出来的接口更便于为开发者所知道。
  • 道名要言简意赅,从左到右读起来要像个常见用语中之句子才好。
  • 方式名里不要动缩略后的品种名称。
  • 吃方从名时第一要务就是确保该作风与公协调的代码或富有并的框架相符。

host

第 20 长条:为个体方法名加前缀

  1. 利区分公共艺术及个人方法。
  2. 前缀根据个体喜好定,目前察觉多叔方库也颇少用这私有方法名加前缀,这个就扣留个人喜欢吧。
  • 受个人方法的号加上前缀,这样可死易地拿其与公共方法区分开。
  • 匪若单用一个下划线做个人方法的前缀,因为这种做法是留下给苹果店之所以之。

装或回到主机名和目前 URL 的捧口号。

第 21 长长的:理解Objective-C 错误模型

  1. ARC 默认不是
    “异常安全的”,如果遗弃来很,那么应于企图域末尾释放之靶子现在可非见面自行释放了。想要生成
    “异常安全的” 代码,可以设置编译器的表明来促成
    “-fobjc-arc-exceptions”。

  2. 平凡很不便写起在扔来十分时不见面造成内存泄漏的代码,Objective-C
    语言现在以的章程是:只当无比罕见的情况下摒弃来大,抛来大应用程序直接退出,不考虑修复问题,不用还写复杂的
    “异常安全” 代码。


  3. “不那么严重的失实”,令方法返回nil/0,或者是行使NSError,表明中起左有。

  4. NSError 可以经由此对象,把导致错误的因回报为调用者。

    • Error domain 错误范围,其种类也字符串
    • Error code 错误码,其类别为整数
    • User info 用户信息,其品种为字典

    • 先是栽常见用法是:通过委托协议来传递者错误

      - (void) connection:(NSURLConnection *)connection
          didFailWithError:(NSError *)error;
    
    1. 除此以外一栽普遍的艺术是:经由方法的 “输出参数” 返回给调用者

    //定义
    - (BOOL) doSomething:(NSError **)error;
    
    //用法
    NSError *error = nil;
    BOOL ret = [objecr doSomething:&error]
    if(ret){
     //to do
    }
    
    //具体实现
    - (BOOL) doSomething:(NSError **)error {
      if(/*there was an error*/){
       if(error){
             *error = [NSError errorWithDomain:domain
                                      code:code
                                  userInfo:userInfo];
             return NO;
         }
      }else{
         return YES;
      }
    }
    
    //这个*error 语法会为error 参数“解引用”(dereference),也就是说,error 所指的那个指针现在要指向新的NSError 对象,所以这里要确保error 参数不是nil。
    

    传送给艺术的参数是单指针,而该指针的以对另外一个指南针,那个指针指向NSError
    对象(指向NSError
    对象的指针)。这则,此方式不但能够生平凡的归来值,还得经由
    “输出参数” 把NSError 对象回传于调用者。

    1. 以ARC 时,编译器会吧NSError** 转换成NSError * _
      _autorelease*,
      也就是说指针所倚的目标会以艺术执行了后自行释放。这个目标要自动释放,因为
      “doSomething:” 方法无能够担保调用者可以管这措施被创造的NSError
      释放掉,所以要在autorelease。
  • 除非有了不过使全应用程序崩溃的严重错误时,才答应采取特别。
  • 以左不那么重的动静下,可以选派 “委托方”(delegate
    method)来处理错误,也足以把错误信息放在NSError 对象里,经由
    “输出参数” 返回给调用者。

hostname

第 22 条:理解NSCopying 协议

  1. 利用对象时需要拷贝它,此操作通过copy
    方法就。如果想叫自己的接近支持拷贝操作,那就落实NSCopying
    协议,该协议才发一个术:

    - (id)copyWithZone:(NSZone *)zone
    
  2. 先前开顺序,会拿内存分成不同的
    “区”(zone),而目标会创以不同区里面,现在绝不了,每个程序只生一个区:“默认区”(default
    zone)。

  3. NSMutableCopying 协议和NSCopying 类似,也止出一个办法:

    - (id)mutableCopyWithZone:(NSZone *)zone 
    
  4. 如若您的类分可换版本与不可变版本,这片单商量而都应有实现。

  5. 专注:在可变对象及调用copy 方法返回另外一个不可变类的实例。

  6. 当编制拷贝方法时,还要确定一个问题:应该尽 “深拷贝”(deep
    copy)还是 “浅拷贝”(shallow copy)。

  7. 深拷贝是靠以拷贝对象自我时,将那个底层的数量为同并复制过去;浅拷贝只对拷贝对象的指针,并无见面拷贝底层的数码。Foundation
    框架中之富有collection 类默认都尽浅拷贝。

  8. 靡专门定义深拷贝的协议,所以实际实行办法由于每个接近来确定。另外不要使遵从了NSCopying
    协议的靶子还见面实施深拷贝。绝大多数情下,执行之都是浅拷贝。

  • 如若想叫自己所写的对象有拷贝功能,则用兑现NSCopying 协议。
  • 倘若从定义之对象分为可换版本与不可变版本,那么就要以落实NSCopying
    与 NSMutableCopying 协议。
  • 复制对象时要控制采取浅拷贝还是深拷贝,一般景象下该尽量执行浅拷贝。
  • 倘你所写的目标要深拷贝,那么得考虑新增一个专门执行深拷贝的道。

装或回到时 URL 的主机名。

href

安装或返回完整的 URL。

pathname

设置或返回时 URL 的路径有。

port

装或回到时 URL 的捧口号。

protocol

设置或回到时 URL 的磋商。

search

安或回到从问号 (?) 开始之 URL(查询部分)。

上述就是location函数相关,这些在一部分端还是相当不错的选。具体事例,看下的demo。

第一我们安首页,首页中生广大栏目链接,为了方便这里首页用index1命名,简化代码。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>首页1</title>
    </head>

    <body>
        <a href="index2.html">index2</a>
        <a href="index3.html">index3</a>
    </body>
</html>

说不上我们设置index2栏目的页面,在该页面被,我们而引入jquer文件,和咱们友好写的js文件。更要的凡坐凡随便添加进去的分栏(小模块),所以,我们要吃起我们的分栏容器~

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>index2</title>
    </head>
    <script src="js/jquery-1.11.3.js" type="text/javascript" charset="utf-8"></script>
    <script src="js.js" type="text/javascript" charset="utf-8"></script>
    <body>
        <div class="index2">

        </div>
    </body>
</html>

同理,我们安index3的页面。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>index3</title>
    </head>
    <script src="js/jquery-1.11.3.js" type="text/javascript" charset="utf-8"></script>
    <script src="js.js" type="text/javascript" charset="utf-8"></script>
    <body>
        <div class="index3">

        </div>
    </body>
</html>

如此首页,和首页要连续的页面就设置完,接下去我们用装的是链接到的index2,和index3页面上的擅自分栏的情节页.例如链接到index2的分栏是,我们起名为getweb

<div class="div1">
    <ul>
        <li>123</li>
        <li>345</li>
        <li>456</li>
        <li>576</li>
    </ul>
</div>
<div class="div2">
    <ul>
        <li>123</li>
        <li>345</li>
        <li>456</li>
        <li>576</li>
    </ul>
</div>
<div class="div3">
    <ul>
        <li>123</li>
        <li>345</li>
        <li>456</li>
        <li>576</li>
    </ul>
</div>
<div class="div4">
    <ul>
        <li>123</li>
        <li>345</li>
        <li>456</li>
        <li>576</li>
    </ul>
</div>
<div class="div5">
    <ul>
        <li>123</li>
        <li>345</li>
        <li>456</li>
        <li>576</li>
    </ul>
</div>

与理链接到index3的分栏内容呢getweb2

<div class="div1">
    <ul>
        <li>123</li>
        <li>345</li>
        <li>456</li>
        <li>576</li>
    </ul>
</div>
<div class="div2">
    <ul>
        <li>额版本</li>
        <li>额版本</li>
        <li>额版本</li>
        <li>额版本</li>
    </ul>
</div>

分栏的内容页做好后,剩下的尽管是咱的js代码了;

//根据url的信息来判断需要显示的内容。
        $(function(){
            var url=window.location.href;//获取完整的URL
            if(url.indexOf("index2")>=0){//判断URL中是否含有某字符串(判断是哪一个页面)
                $.get("getweb.html",function(data){
                    $(".index2").html(data);
                });
            }else if(url.indexOf("index3")>=0){
                $.get("getweb2.html",function(data){
                    $(".index3").html(data);
                });
            }
        });

怎样是不是非常简单,这样的基于页面来随便添加分栏,在晚的护卫及分栏内容还给都是相当好之,我们特需要修改分栏内容页面就好。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图