当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于空指针错误的处理        关于空指针异常的处理 在Android中使用Log时的处理:         Integer i = null;        try {            Log.v("abc == " + i.intValue());        } catch (Exception e) {            // 此处会.........
    ▪ objective C中的@class, SEL , IMP等灵便机制(五)        objective C中的@class, SEL , IMP等灵活机制(五) holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7347399   在objective c中,如.........
    ▪ 创始人怎么设置公司股权结构       创始人如何设置公司股权结构? 对于中早期的企业来说,创始人在公司成长过程中扮演着很多角色,最重要的角色通常是决策者,当公司面临这样那样的问题时,创始人来决定一个团队的力.........

[1]关于空指针错误的处理
    来源: 互联网  发布时间: 2014-02-18
关于空指针异常的处理

在Android中使用Log时的处理:

        Integer i = null;
        try {
            Log.v("abc == " + i.intValue());
        } catch (Exception e) {

           // 此处会引发新的异常:“java.lang.NullPointerException: println needs a message”,因为Android不支持消息内容为null.所以不能这样使用,需注意。
            Log.e("MainActivity", e.getMessage());           
        }


    
[2] objective C中的@class, SEL , IMP等灵便机制(五)
    来源: 互联网  发布时间: 2014-02-18
objective C中的@class, SEL , IMP等灵活机制(五)

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7347399

 

在objective c中,如果细心的话会发现,每个类中都会自动生成一个class 类型的isa,

 

[plain] view plaincopy
 
  • @interface NSObject <NSObject> {  
  •      Class    isa;  
  •  }  
  • isa是什么,class又是什么呢,找到Class的定义我们会发现如下:

     

     

    [plain] view plaincopy
     
  • typedefstruct objc_class *Class;  

  • 而objc_class以前的定义又如下,现在据说被封闭了,不知道有没有再作修改,总之方便我们理解就好:

     

     

    [plain] view plaincopy
     
  • struct objc_class {  
  •      Class isa;  
  •        
  •      Class super_class;  
  •        
  •      const char *name;  
  •        
  •      long version;  
  •      long info;  
  •        
  •      long instance_size;  
  •      struct objc_ivar_list *ivars;  
  •      struct objc_method_list **methodLists;   
  •        
  •      struct objc_cache *cache;  
  •      struct objc_protocol_list *protocols;     
  •  }  
  • 于是我们就有了点头绪了,isa,is a pointer,是个指针(根据网上的资料,这样理解是最贴近事实的,不管你们信不信,反正我是信了),每个类都有一个class类型的指针isa,继承自NSObject中,继承关系,方法变量等信息都存放在isa中,isa作为一个隐藏的属性,会自动生成于每个类之中。有了这个前提,也就可以解释为什么我们可以根据@class来代替任意一个类了,看代码:

     

    Human.h

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject  
  • -(void)say;  
  • @end  

  • Human.m

     

     

    [plain] view plaincopy
     
  • #import "Human.h"  
  •   
  • @implementation Human  
  • -(void)say  
  • {  
  •     NSLog(@"Human中的say方法");  
  • }  
  • @end  

  • main.h

     

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •           
  •         Class c =NSClassFromString(@"Human");  
  •         [[c new] say];  
  •         //以上CLASS类型的c,就相当于Human类。  
  •     }  
  •     return 0;  
  • }  

  • class可以灵活的代替别的类,SEL与其类似,不同的是SEL代替的是方法,可以方便的代替其他方法,class中是因为有isa属性保存有类的信息,而SEL是因为即使是在不同的类中,方法名只要相同,这两个方法的ID就相同,SEL就是根据这个ID来找到该方法,再根据调用该方法的类的不同来找到唯一的地址。看代码再作解释:

     

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  •   
  •   
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject  
  • -(void)say;  
  • @end  
  • @implementation Human  
  • -(void)say  
  • {  
  •     NSLog(@"Human中的say方法");  
  • }  
  • @end  
  • //上面定义了一个human类,里面有一个say方法  
  • @interface man:NSObject  
  • {}  
  • -(void)say; @end  
  •   
  • @implementation man  
  • -(void)say  
  • {  
  •     NSLog(@"man中的say方法");  
  • }  
  • @end  
  •   
  • //在上面定义了一个man类,同样有一个say方法  
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •           
  •         Class a =NSClassFromString(@"Human");  
  •         Class b =NSClassFromString(@"man");  
  •         //根据方法名say找到该方法的id,将sel与其绑定;  
  •         SEL sel = NSSelectorFromString(@"say");  
  •         [[a new] performSelector:sel];  
  •         [[b new] performSelector:sel];  
  •           
  •           
  •           
  •     }  
  •     return 0;  
  • }  
  •  

    结果如下:

     

    [plain] view plaincopy
     
  • 2012-03-13 10:13:24.900 String[2725:403] Human中的say方法  
  • 2012-03-13 10:13:24.901 String[2725:403] man中的say方法  


  •  

    通过以上代码我们会发现,SEL通过方法名绑定后,可以被多个类实例调用,找了些网上的资料,解释都是说方法名一样的话,ID会一样,地址仍不同,才会实现这样的效果,我们不谈论是否准确,但我个人认为这是目前最合理的解释。这种用法的优势一方面是灵活性更高,类似于多态,另一方面是,这种用法sel找方法时匹配的是ID而不是字符串方法名,所以在效率上会高一些。还有一种更终极的方法,直接对应方法的地址,这种方法效率最高,请看代码:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  •   
  •   
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject  
  • -(void)say;  
  • @end  
  • @implementation Human  
  • -(void)say  
  • {  
  •     NSLog(@"Human中的say方法");  
  • }  
  • @end  
  • //上面定义了一个human类,里面有一个say方法  
  • @interface man:NSObject  
  • {}  
  • -(void)say; @end  
  •   
  • @implementation man  
  • -(void)say  
  • {  
  •     NSLog(@"man中的say方法");  
  • }  
  • @end  
  •   
  • //在上面定义了一个man类,同样有一个say方法  
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •           
  •         Human *human =[Human new];  
  •         man *ma=[man new];  
  •         //根据方法名say找到该方法的id,将sel与其绑定;  
  •         SEL sel =@selector(say);//也可以这样写:SEL sel=NSSelectorFromString(@"say");  
  •         IMP imp1 = [human methodForSelector:sel];       
  •         IMP imp2 = [ma methodForSelector:sel];       
  •   
  •         imp1(human,sel);  
  •         imp2(ma,sel);  
  •         //因为每个方法都有自己的地址,这种方式直接找到地址区分相同ID的方法,效率最高,但灵活性不如SEL方式。  
  •           
  •     }  
  •     return 0;  
  • }  
  •  

    输出语句:

    [plain] view plaincopy
     
  • 2012-03-13 10:35:21.446 String[3763:403] Human中的say方法  
  • 2012-03-13 10:35:21.450 String[3763:403] man中的say方法  


  • 今天这些内容不太好理解,我用自己理解的方式给大家再解释一遍,class用于代替类,增加灵活性,因为我们不知道什么时候会用到什么类,方法也是如此,所以SEL可以代替方法,每个方法有方法名,ID,地址,相同的方法名,ID也一样,正常情况下我们根据方法名找到方法,用SEL方法可以根据ID找到方法,而用IMP方式可以直接找到地址,但是灵活性不如SEL方法,虽然效率最高。好了,今天到此为止。

     

    关键字:objective-c ,objective c , oc ,@class, SEL ,selector ,IMP


        
    [3] 创始人怎么设置公司股权结构
        来源: 互联网  发布时间: 2014-02-18
    创始人如何设置公司股权结构?

    对于中早期的企业来说,创始人在公司成长过程中扮演着很多角色,最重要的角色通常是决策者,当公司面临这样那样的问题时,创始人来决定一个团队的力量往哪用,怎么用,带领团队同舟共济,渡过难关。我们可以说创始人对公司的控制权决定着公司发展的方向和成长速度。

    对于具有快速成长潜力的企业来说,合适的投资人加入是让企业加速腾飞的强劲动力,但投资人作为公司股东进入公司之后,创始人如何平衡和投资人之间的权利的分配,如何在融资之后还对公司具有强有力的控制权,有时候取决于创始人在企业成立之初的各种决策,也取决于融资谈判过程中与投资人的各种约定。

    同时,对于联合创始人而言,可能损失部分当期工资收益,股权是其长期收益的保障,是调动其工作积极性的有效方式。



     “传统投资”模式我们可以理解为股东出钱,按现有公司出资比例持股,以获得公司分红为目的,创始人控制权受投资人占股比例影响;“创投模式”是投资人出大钱占小股,以公司股票巨额增值溢价转让为目的,公司创始人仍然是公司大股东,对公司具有控制权。

    比如一个创业者成立一家互联网公司,注册资本50万人民币。“传统投资”,投资人投入50万,占股50%,每年分得利润的50%。

    “创投模式”,投资人投入100万,会按照公司固定资产、商誉、业务模式创新、创始团队的管理才能等来估值,如果公司估值800万,则投资人占股12.5%。投资人的收益具有风险性,如果公司经营的好,3年后公司估值达到1亿人民币,投资人股权值1250万,翻了12.5倍。

    基于“创投模式”的公司控制权主要是对创始人来说的,由于投资人进入而丧失对公司的控制权其实损害的是创业者和投资人双方的利益,如何保护创始人对公司的控制权呢?主要有三个方面:

    1. 公司初始股权结构的设计

    创业之初,如果只有一个股东,即可成立一人有限责任公司,100%拥有股权。如果是2个或以上股东一起成立有限责任公司,2人持股比例尽量避免 50%:50%,3人尽量避免33%:33%:34%。2名以上股东的公司,要对公司具有绝对的控制权,那么持股比例需要超过2/3。



     2. 融资过程中的股权结构设计

    如果您迫不及待的想了解融资过程中股权结构设计,那您是否正准备融资,或者正接受融资呢?不论是第几轮融资,相对其他因素来说融资期间的股权结构变化是对公司控制权影响最大的,因为融资协议规定的事项,不但涉及本轮融资之后权利的变化,还涉及下一轮融资,投资人,创始人退出的权利安排。注:如果您的公司在成立之初的股权比例就有问题,那需要创始人之间调整好之后再谈融资计划。

    如图三我们所看到的,为什么不建议50%:40%:5%:5%的比例呢?公司的决策权看似飘忽不定,5%的持股者的支持将会成为50%和40% 的被拉拢对象,不利于公司决定权的稳定性。如果40%的持股者是投资人的话,一旦出现决策与创业者不和,他股权占比超过1/3有可能使创业者无法推进任何公司重大决策。



     3. 选择适合的保护控制权的法律条款设计

    公司经营的好,队伍不断发展壮大,除了创始人和投资人之外,当然还有高管和员工。如何吸引优秀的人加入创业公司,调动大家工作的积极性,股权或者期权的激励机制是非常好的方式。创始人在这时往往会想建立股权期权的同时,如何让公司的控制权还牢牢的掌握在自己手里?建立期权池并通过合理的制度设计也可能会起到产生强化创始人对公司控制权的作用。

    期权、受限制、代持、持股公司

    一致行动计划

    牛卡计划(适用于境外结构企业)

    在此给创业者提个醒,不论是什么阶段的公司,融资、股权激励和期权激励在法律上是非常专业的部分,要选择专注于此领域的律所,必须是从业经验丰富的律师来操刀,这有点像医生,要是病没治好还弄出了癌,后悔药没地吃。

    本文根据华哥自话改编,在此多谢华哥贡献。


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3