一点一滴,编程人生

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  69 随笔 :: 0 文章 :: 25 评论 :: 0 Trackbacks

2012年4月16日 #

今天为了这个问题了忙乎了一整天,特此记录下,希望对有遇到同样问题的同学有帮助。事情的经过是这样的,原先使用atomikos一直把数据源用jndi配置到tomcat的context.xml下,一直这么用没有出现问题,配置如下
    <Resource name="jdbc/cms" auth="Container"
        type
="com.atomikos.jdbc.AtomikosDataSourceBean" factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
        uniqueResourceName
="jdbc/cms" xaDataSourceClassName="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
        xaProperties.URL
="xxxx"
        xaProperties.user
="xxxx" xaProperties.password="xxxx"
        xaProperties.pinGlobalTxToPhysicalConnection
="true" maxLifetime="60" poolSize="4" />

最近项目要迁移到maven下,所以把context.xml的数据源配置挪到了spring.xml下,配置如下
    <bean id="myDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
       
<property name="uniqueResourceName" value="masterDB" />
       
<property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>  <!-- SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]  -->  
       
<property name="poolSize" value="0" /> 
       
<property name="minPoolSize" value="0"/>    
       
<property name="maxPoolSize" value="9"/>    
       
<property name="borrowConnectionTimeout" value="60"/>    
       
<property name="reapTimeout" value="20"/>    
       
<property name="maxIdleTime" value="60"/>    
       
<property name="maintenanceInterval" value="60"/>    
       
<property name="loginTimeout" value="60"/>
       
<property name="xaProperties">  
            
<props>
                
<prop key="url">xxxx</prop>  
                
<prop key="user">xxxx</prop>
                
<prop key="password">xxxx</prop>
            
</props>
        
</property>  
    
</bean>
因为上面这个配置我是照搬网上的,所以觉得没有问题,可是项目启动后,用此数据源提交事务时确报以下错误:

Raised -5: invalid arguments were given for the XA operation 或 XAER_INVAL: Invalid arguments (or unsupported command)

一开始我以为maven配置的mysql-connector-java驱动版本不对,或是atomikos版本不对,可是不管如何换版本都不行,就快要疯了的时候,我看到了原先jndi方式中有这么一行代码
xaProperties.pinGlobalTxToPhysicalConnection="true"
就因为缺少上面这句话导致了问题,上网查资料,据说是mysql xa bug,有兴趣的可以看如下连接,最后配置如下:
       <property name="xaProperties">  
            
<props>
                
<prop key="pinGlobalTxToPhysicalConnection">true</prop>  <!-- mysql必须配置此参数,要不然无法提交事务 -->
                
<prop key="url">xxxx</prop>  
                
<prop key="user">xxx</prop>
                
<prop key="password">xxxx</prop>
            
</props>
        
</property> 



posted @ 2017-06-28 19:32 writegull 阅读(2451) | 评论 (0)编辑 收藏

事情描述:
本人在阿里云上创建了一个linux服务器,跑了一个自己的测试web项目。搭建了redis。想方便测试用,就没有对redis进行任何安全防护并暴露在了公网上。期间阿里云发现了此问题,还发短信提醒我,由于最近在公司一直加班也没有时间理会,没想到就在今天真的被黑了,事后心想多亏是个测试服务器,如果是正式环境,也真危险,这个黑客也没有停下脚步,通过redis强大的能力在/root/.ssh目录下面上传了公钥,彻底攻破了服务器,免密码登录服务器,一般黑客到这步也就看看有没有兴趣的数据,这个黑客一看这就是个没有价值的测试服务器,所以心一横,在我这上面装了个DDOS攻击软件,把我的机器当起肉鸡。

1.这就是黑完后留下的公钥/私钥,删除authorized_keys,id_rsa, id_rsa.pub这三个文件吧,除非还想让他继续黑下去。。。。


2.通过redis的key *命令可以看到有个叫crackit的key。这就是黑客在入侵后留下来的,原先set的值是公钥,入侵成功之后就改成这个了,把这个key也删除掉吧。


3.修改redis默认端口吧,不让黑客利用6379端口。在redis安装目录中,修改redis.config文件。修改完了别忘了重启redis服务,

# redis-server /etc/redis/redis.conf 开启

# redis-cli shutdown 关闭



4.重启后查看redis是否运行
ps -x | grep redis
5.通过指定端口访问redis。
redis-cli -p 6666

6.给redis设置密码或者干脆设置成只能内网访问

7.通过top命令发现了几个可疑的程序



8.minerd这个程序是个用来挖掘莱特币的,这个黑客看来干了不少坏事啊。。我们用命令 ps -ef|grep minerd 查找一下这个进程,杀掉这个进程kill -9 18267,并且去/tmp目录删除minerd目录


9.黑客在tmp目录留下了一个叫1.sh的脚本,是用来下载挖掘莱特币程序的。也把它kill掉吧。以下是脚本内容。


10.通过cat /etc/passwd命令可以看到有一个叫作syss的非法用户,权限还很高,跟root一样,删掉他吧,这是黑客入侵后方便进入的。使用命令userdel -f syss 强制删除一个用户,哪怕他正在登录。


11.去/mnt目录上,可以看到黑客挂载了很多程序,删除他们吧。


12.通过nethogs软件可以按进程实时统计网络带宽利用率,这个用来看是否存在DDOS攻击最好不过了。

13.暂时解决对外DDOS攻击,最快的办法就是用防火墙,这个阿里云提供的脚本帮了大忙。直接上传到服务器上,运行一下世界就清静了。下载地址:
https://help.aliyun.com/knowledge_detail/5973920.html?spm=5176.7618386.5.1.H8H33f

 
posted @ 2015-12-15 01:13 writegull 阅读(4111) | 评论 (4)编辑 收藏

今天在修改server.xml调试程序时,遇到下面这个问题,clean,重启都不好使。

                Removing obsolete files from server..
               Could not clean server of obsolete files: null
                java.lang.NullPointerException
解决方法是把.metadata\.plugins\org.eclipse.wst.server.core这个目录下面的tmp0删除掉,再clean下就可以了。可能是缓存问题。
posted @ 2015-01-03 16:58 writegull 阅读(7271) | 评论 (0)编辑 收藏

有时候需要手动地去禁用一个uibutton,使用button.enabled = NO的时候虽然能够达到目的但也会带来副作用,那就是按钮变的半透明了。有时候应用不需要这种副作用,可以尝试使用button.userInteractionEnabled = NO来达到这个目的,在禁用按钮的同时也不会使得按钮变得半透明。
posted @ 2013-12-23 10:29 writegull 阅读(590) | 评论 (0)编辑 收藏

装win8后发现cpu占用率50%-60%,而且磁盘疯狂读写,是com surrogate这个程序,还有几个服务造成的,之后我把com surrogate结束进程了cpu使用率直接降低到10%以下,我就郁闷了。
解决方案:
1,在“更多电脑设置”那里的“用户”改为“本地用户”。
2,“离开”家庭组(一般都是它的原因)
3,“同步设置”关
4,一般“共享”什么的不到需要都是“关”的状态。
5,做完以上几点都不行,就真帮不了你了。
posted @ 2013-03-18 22:47 writegull 阅读(393) | 评论 (0)编辑 收藏

这个问题似乎只有在手动改变系统状态栏级别的情况才会出现

例如:self.window.windowLevel = UIWindowLevelStatusBar+1;

这样设置的话相当于影响了弹出短信或邮件控制器页面window的级别,所以造成不显示键盘问题(不过此问题在ios6以下没有)

解决方法:在当前视图控制器中加入下面的代码,即可解决

- (void) viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    self.window.windowLevel = UIWindowLevelNormal;

}

posted @ 2012-10-30 21:08 writegull 阅读(1564) | 评论 (1)编辑 收藏

原文地址:http://blog.csdn.net/pjk1129/article/details/7255163

最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework。在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法。不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究。

我这个文档的静态库的开发是基于Xcode4.2和iOS SDK5.0编写的。Xcode4跟之前的Xcode3还是有不少的差别的。

下面就简单写一个静态库和一个调用静态库的例子。

静态库的编写:

1.静态库工程的建立:

Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Cocoa Touch Static Library。直接next去建立一个Print这样的工程。


2.工程建立

我们添加很简单的"- (void)printA;"和"+ (void)printB;"的方法,这个方法的实现也是很简单的,在*.m文件中的实现就是一个"NSLog(@“”);"这样我们编译出来的libstaticlib就可以被其他的IOS工程进行调用了。这块注意一下,目前我们的Print->iOS Device



3.编译前准备

这里分release与debug版本,需要设置一下


4.OK,编译

我们可以在Products下面找到我们编译生成的libstaticlib.a这个文件。

注意未编译前为红色:左                             编译后为黑色: 右

       

5.ok

在右边 这个文件上右键Open In Finder。这时候我们打开了一个文件夹,里面有一个libPrint.a。后面我们继续编写一个调用这个libPrint.a的App。但是这个App在编译时候会出错,通过这个错误的解决,说明Xcode的一些编译相关的东西。这里,我们在command下面根据路径找到这个文件,用这个非常重要的命令查看一下这个lib的信息!

打开终端写入如下命令:这是什么?这就是所在的路径 

以下均是在自己的mac上的路径。你需要将/Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/ 替换成你的路径。

cd /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/  

我们手动打开这个路径:可以看到如下信息:Release-iphoneos


这个是给真机用的,那我们要给模拟器和真机封装的静态库应该都能用才好。这个下面介绍!!!!!  


然后再在终端 打开这个文件:cd /Users/user/Library/Developer/Xcode/DerivedData/UItab-dbvoszbzpavyglaboxgflvrnzfce/Build/Products/Debug-iphoneos

命令是:lipo -info libPrint.a,可以看到显示的结果是:Arch是  Arm7。下面我会具体介绍一下。


6.建立一个调用这个libPrint.a的应用

应用就很简单了,我们添加刚才libPrint.a的*.h文件。 然后在这个工程的Build Phases的Link Binary With Library里面添加我们刚才拷贝出来的那个libPrint.a。



7.插入了h和a文件后

我们就可以在control里面调用这个libPrint.a 函数了。

#import "AstroDiskAppDelegate.h"

#import "Print.h"


@implementation AstroDiskAppDelegate


@synthesize window = _window;


- (void)dealloc

{

    [_window release];

    [_viewController release];

    [super dealloc];

}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    

    //调用libPrint.a

    [Print printB];

    Print  *print = [[[Print alloc] init] autorelease];

    [print printA];


    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    [self.window makeKeyAndVisible];

    return YES;

}


8.OK,编译运行这个应用程序。

编译出现错误了。这个就是这篇文档的关键了。主要就是为了介绍编译静态库相关的东西。



9.可以看到undefine symbols for architecture i386这样的错误。

其实这个错误原因很简单,就是因为,我们用错了编译出来的libUITab.a lib,在模拟器里面,我们需要的是基于i386构架编译的static lib,但是这个a文件,大家还记得前面说的arm6 arm7构架的么。这个a其实是在iphone这个arm构架上运行的代码。其实show in finder指向的是一个ios device的库,并不是i386模拟器下的库。那如何编译i386的库呢?看见第二张图片的Print>IOS Device了么?我们将这个iOS Device修改成iPhone5.0 Simulator。在进行编译,这样就可以编译出i386下面的库。这个时候我们show in finder打开的文件夹还是ios device下的库。我们最好自己去那个目录下看一下。这里我们用command去查看了一下目录情况,如下:可以看到一个iphoneos的目录和一个simulator的目录。


然后我们再看看这个目录与第4条所示的目录有什么不同! 同样也有一个libPrint.a文件。



10.错误原因分析

Release-iphoneos里面的是基于arm6 arm7编译出来的库文件。Release-iphonesimulator文件夹下面的是基于i386编译出来的文件。

11.合并.a文件,制作通用静态库

这二个库一个是用于真机运行的一个是用于模拟器运行的.其实我们可以利用lipo将这二个文件打包成一个通用的a文件。命令如下:

/Users/user/Library/Developer/Xcode/DerivedData/UITab-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products替换成你的路径。 

/Users/user/Desktop/libPrint.a替换成合并后的路径。 

lipo -create /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphonesimulator/libPrint.a  /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphoneos/libPrint.a  -output /Users/pjk1129/Desktop/libPrint.a


12.打包以后的库文件,我们查看信息

然后打入如下命令:lipo -info /Users/pjk1129/Desktop/libPrint.a 

可以看到如下信息:


如上,你已经看到了,它具备了i386和arm7的条件。 现在我们这个静态库,支持的构架已经是armv7 i386了。


13.ok,经过上述步骤后

这个通用库生成后,我们将原来,调用这个库进行替换一下,在进行编译,成功编译,运行结果如下所示:


posted @ 2012-10-09 18:14 writegull 阅读(636) | 评论 (0)编辑 收藏

three20 wiki 地址:https://github.com/facebook/three20/wiki/Debugging

You can use Three20's debugging facilities instead of NSLog() / assert(). This would give you an ability to turn off debugging messages without commenting out all NSLog's, sort log messages by importance (errorwarninginfo).

Turn on debugging(打开调试)

These instructions are for Xcode 3:

  • Right-click on project, choose "Get Info".
  • In the "Build" tab, choose "Configuration => Debug" (you probably want to enable this only for debug builds)
  • While in the "Build" tab, search for "Preprocessor Macros" under the "GCC 4.2 - Preprocessing" section.
    • Add a declaration that reads DEBUG. That way you enable debugging in general.
    • Add a declaration that reads TTMAXLOGLEVEL=TTLOGLEVEL_INFO. By doing this, you set the default debugging output to beTTLOGLEVEL_INFO, the most descriptive one.

Debugging preprocessor macro

Use debugging

Logging

Use these instead of NSLog(). Which level gets printed to the console and which doesn't depends on what's set in preprocessor macros asTTMAXLOGLEVEL (see above).

TTDERROR(text, ...)    // Log level 1 TTDWARNING(text, ...)  // Log level 3 TTDINFO(text, ...)     // Log level 5 TTDPRINT(text, ...) 

Example

If I got this in AppDelegate.m of my project HelloWorld:

- (void)applicationDidFinishLaunching:(UIApplication *)application {	     TTDINFO(@"Hello!"); } 

...the console output would look like this:

2010-05-15 01:04:20.107 HelloWorld[65222:207] -[AppDelegate applicationDidFinishLaunching:](22): Hello! 

Conditional logging

This is a type of logging facility which only outputs something if a particular condition is met:

TTDCONDITIONLOG(condition, text, ...); 

Example

TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @"Request parameters: %@", request.parameters); 

Debug-only assertions

Three20 also provides support for assertions which only work in the debug build.

TTDASSERT(condition_which_would_lead_to_application_termination_when_true); 

Example

// Not that implementing safeAddSubview: is a good idea - (void)safeAddSubview:(UIView*)view {     TTDASSERT(nil != view);     if (nil == view) {         return;     }     [self addSubview:view]; } 

See also

Links

posted @ 2012-09-27 10:30 writegull 阅读(397) | 评论 (0)编辑 收藏

翻译:http://www.joshsunshine.me.uk/2012/02/29/ios-development-remove-old-notifications-from-notification-center.html

不逐字翻译了,只是大体说一下。
看作者的意思,应该是他经常收到N多通知,而通过其中一条通知打开一个app以后,发现那个app的其它通知还在通知中心。作者不喜欢这样的情况。我以为我也存在的这样的情况,马上检查了一下,发现没有。看来是少数app的问题。但是也记录一下。作者总结的从通知中心移除通知的三种方法:
1.将app的BadgeNumber设为0,就是app图标右上角那个

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];


2.如果BadgeNumber本身就是0的情况,可以先将其设1再设置成0

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

3.如果以上的办法都不好使的话,那就用本地通知欺骗一下。

UIApplication* application = [UIApplication sharedApplication];
NSArray* scheduledNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications];
application.scheduledLocalNotifications = scheduledNotifications;

就这么多了,我仔细想了一下,为什么我的应用从其中一条通知打开的时候,其它的通知消失掉:
因为我在程序启动的时候就执行了第一条:)

posted @ 2012-09-14 17:51 writegull 阅读(2746) | 评论 (0)编辑 收藏

使用MFMessageComposeViewController 编写发短信模块时界面是英文的情况下,用下面的方法可以解决问题

在plist里面Localization native development region 选择 china ,然后Localized resources can be mixed 选 YES,如果没有Localized resources can be mixed,需手动添加
posted @ 2012-09-10 18:12 writegull 阅读(695) | 评论 (0)编辑 收藏

1.图标的圆角效果是系统自动加上的。

2.光晕效果虽然也是系统加上的,但可以通过程序中设置参数来去掉内建光晕效果。

方法:在info.plist里面添加一条记录UIPrerenderedIcon,新版的XCODE 会自动识别为Icon already includes gloss effects 打上勾就OK了。如果没有识别的右边栏写上YES就可以

posted @ 2012-07-31 14:06 writegull 阅读(621) | 评论 (0)编辑 收藏

     摘要:   阅读全文
posted @ 2012-07-25 11:14 writegull 阅读(1961) | 评论 (1)编辑 收藏

原文地址:http://blog.itotem.com.cn/?p=22

- alloc, copy, retain会把引用计数+1

- release会把引用计数-1

- 局部变量如果初始化时不是autorelease的,要及时调用release释放,并且赋值为nil否则引用仍然存在导致下次无法用nil做是否有值的判断

- 实例变量要在每次赋值时要先释放当前引用的对象再赋值,并retain一下保证引用计数为1

- 对于有retain参数的property,直接使用”.”赋值时系统会自动释放当前引用对象再赋值,并自动retain一下

- dealloc中要对所有实例变量调用release,对于有retain参数的property只需要调用self.theProperty = nil即可,系统会去做释放

- delegate的property通常设为assign,如果设为retain的话会有循环引用的问题,比如aView.delegate = self时会把self retain一下,在aView的dealloc中会把delegate release,但是由于self的引用永远不会小于1,所以导致aView和self的dealloc永远都不会被执行,都永远驻留内存造成泄露。所以如果要设为retain的话一定要确保不会造成循环引用问题。

- 在UIViewController中的viewDidUnload中要释放掉局部变量,调用release并设为nil,有时系统收到内存警告时会自动调用这个函数来释放一些内存空间

- 系统内存警告的回调中要释放掉内存中的缓存和其他可释放的东西,以免造成crash

- 使用UITableView时要把cell设置为重用的,并且要确保确实写得是重用的,有的人写完的结果相当于还是每次都重建cell,导致效率低下

- 使用UIScrollView时要自己控制释放掉目前不显示的内容,尤其是图片,考虑图片大小和浏览效果可以加载当前显示页两边的3-5页内容

- 图片需要做缓存,尤其是本地文件系统缓存,可以放到Library/Cache目录中,这个目录系统有专用的常量来获取,比如:

这里是一个小例子阐释前几条基本原则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- (void)aFunction{
//创建一个局部变量view
UIView *view = [[UIView alloc] init];
// 赋值给实例变量theView
[theView release]; //先释放一下当前引用的变量
theView = [view retain]; //给实例变量赋值时需要retain一下
// 如果theView是一个有retain属性的property
self.theView = view; //不需要先释放,也不需要调用retain,系统会自动做,所以一定不能这样写self.view = [[UIView alloc] init];,这样的话创建的view会被retain两次,造成泄露,对于这种可以先创建一个局部变量,给self.view赋值后再释放
[view release]; //要及时释放局部变量
}
- (void)dealloc{
//释放局部变量
[theView release];
//如果theView是一个有retain属性的property,也可以这样写
self.theView = nil;
[super dealloc];
}
posted @ 2012-07-05 17:05 writegull 阅读(1228) | 评论 (1)编辑 收藏

今天测试程序时发现一个奇怪的现象,我在关于页面中想显示图片icon文件,可是怎么调试都不显示。后来加载其它图片则显示正常。

我分析原因是苹果对程序访问icon文件做了限制,所以不能正常显示

解决方案:把icon文件复制一份,改成其它名字,加载改名字的文件,问题成功解决!
posted @ 2012-06-26 16:10 writegull 阅读(347) | 评论 (0)编辑 收藏

今天开发中使用字符串分割函数split(),发现:
        String s = "upload/20120416135915265.sql";
        System.out.println(s.split("."));
输出的并不是想要的结果,之后输出:
        System.out.println(s.split(".").length);
结果竟然是0!!!
突然想到转义字符,于是:  
        System.out.println(s.split("\\."));
OK啦!!!
原来在java中函数split(".")必须是是split("\\.")。
posted @ 2012-06-24 09:27 writegull 阅读(31361) | 评论 (4)编辑 收藏

感谢蚊帐的投递
新闻来源:伯乐在线
很多人表面上看着老实巴交的,实际上内心比谁都好强、自负、虚荣、甚至阴险。工作中见的多了,也就习惯了。有一些人,什么事都写在脸上,表面上经常得罪人,甚至让人讨厌。但是他们所表现的又未必不是真性情。

我相信大多数人都看过《豪门夜宴》这部香港老电影。张学友、梁朝伟演的拍马屁的场景太有意思了,其中有这样一段:当两马屁精帮老板说出主意,老板马上叫 停,然后拍一下脑门:“哦。。。我想到了。。。”,把别人的idea当成自己的说出来。我在工作中还真不止一次遇到这种事,我提出来的想法老被别人拿来当 作自己的原创,当然个别小偷洋洋得意的描述自己的‘原创’时还会偷偷的瞄我一下,看我有没有不高兴,,,我并没有不高兴,大概是因为想到那个电影段子被逗 乐了。天下学术都一大抄,更何况什么想法,什么创新,通通都是浮云!

君不见创新项目一大堆,都被抄死化成灰
! 但是不能因此而放弃创新,大地不可以因为有畜牲吃草而不复生机,山泉也不会因为有王八偷水而不冒活水。第一点:保持有一颗生机灵动的心。因为这个东西是别 人偷不走的,也是最大的财富。如果你不俱备这个东西,那么请用一颗善心去培养它。人人都是耀眼的珍珠,只是被灰尘蒙蔽了眼。

记得刚进公司那会踏踏实实工作,满怀激情。不过第一周就把自己的顶头上司给得罪了,我并没有做错什么,记得当时还有同事帮我说话,后来慢慢发现他是一个相 当自负的人。不过话说回来搞技术的在技术方面有几个不自负。这次事之后我并没有学乖。对于别人设计不合理的地方,我会指出来,并提出该如何做。对于语言基 础薄弱,设计模式薄弱的同事,我会好心推荐一些书籍,,,,,,本是好心帮助别人,却并没有得到别人的感激。相反,大部分会觉得你看不起他们,更有甚者不但不会反思改进自己的弱点,反而打击报复看不起他的人。所以千万请记住第二点:不可以随便提意见。特别是新人,请务必保持低调。这一点在日常生活中同样实用。

与第二点相对,第三点:经常肯定、称赞同事的成果和进步。注意这里并不是要你去巴结讨好。常常看到别人的优点并加以肯定也是比较正面和必要的行为。这样不但可以增进关系,更重要的是可以鼓励别人。

我一直认为一个人没有自知之明就等同于垃圾。要随时随地知道自己小名叫什么。话说我有一位同事,基础相当薄弱,但又太爱去表现自己,经常到处指指点点,生怕别人不知道自己是“高手”。由于老开“黄腔”常被人背后偷笑而不自知。

第四点:低调一些,谦虚一些不断提高自己的实力。进公司时所在部门是刚成立的,工作一段时间后,我发现由于部门团队开发的特殊性很有必要在公司通用编码规范基础上再制定内部的编码和设计规范,于是向上司 提了我的想法,他同意了。于是我起草了一个内部规范手册。但是执行过程中,有人按手册来,有人不按手册来。产生这种局面的根本原因是上司并没有支持。

在这 里没有必要分析原因,直接给出要记住的第五点:不在其位,不言其事。做好本职工作就好。无论在什么地方,开明而大度的好上司并不多,所以这一点相当重要。

经常在开会讨论设计方案的时候,会发现一个非常有意思的事情。会议本来进行的正常而和谐,当轮到某个优秀的人上去讲的时候,气氛一下子不和谐了。大家都迫 不及待的想挑出他的毛病,就算没理解别人的意思也会乱说一气。秀才遇到兵了,,,,,,以前实习的公司中也时常见到这种情况。每当此时我都会在下面感叹: 好一幅百鸟凤图。请记住第六点:木秀于林风必摧之,要懂得韬光养晦,不要时时锋芒毕露

公司里有个老员工,实力比较强,算是一个独挡一面的人。不过在一次部门改组中并没有得到提升,被提升为经理的反而是一个能力不算太强,还比他晚来的人。在此之前我听到过那个老员工在和其它公司接触并准备跳槽的传闻。第七点:不到最后一刻,自己离职的想法不可以和公司内部任何人分享。因 为站在公司的角度来看你已经不忠诚了,不愿意重用你了。但是在员工自己的立场来看,公司给的待遇与能力不成正比、不认同公司的文化、想换个环境、想要一个 更好的发展机会,这些都是合情合理的。我个人发现一个规律:在一般的公司里,凡是坚持到最后经受住了“考验”的“忠诚”者,往往都是没什么能力的庸才。如 果你是一个公司高层管理者,那么你会如何对待类似的“叛徒”呢?

第八点:不得罪办公室里的女人。此处女人定义如下:(1)国宝级的女程序员; (2)女测试,这个不稀罕 ;(3)女助理,到处都是;(4)女上司,这个最要命!   男的处在一起,有什么冲突矛盾吵吵过了就忘了。但女的不一样,一不小心就得罪了,后边一逮到机会就会摆你一道,还没完没了!最要命的是:背地里狠狠的阴 你,而当着面表现得像你温馨的亲人。

我们研发中心有个领导很可爱,不太清楚上面给他灌了什么迷魂汤,以至于自己职位被降了,职权被销了很大一部分,还整天手舞足蹈高兴得很。事后一两个月才反 应过来不对劲,然后整天愁眉苦脸、、、、、、以这种交际反应的速度,被撤是必然的事情,确实不适合搞管理。技术男大多脑袋是‘方’的,不太善与处理人际关 系。第九点:加强交际能力。程序员大多还算是聪明的,平常稍稍注意一下就没什么大问题。不过不要自我感觉良好,我们公司有个工作了十多年的IT男,几年前就开始被派除去和客户沟通,丫的,至今那一口吞吞吐吐的蹩脚的普通话让人听了就伤心。

第十点:若无特殊情况,一定不要跨级汇报。这一点 细节很重要。某种意义上你的顶头上司就是你的老板,直接决定了你的发展,你就是他手下的兵。并不是谁官大就听谁的,要不然历史上那么多兵变都不可能成功, 因为大家都只听皇帝的,呵呵。从另一个方面讲,你‘忠于’你上司的上司,他也不敢用你,因为谁知道提拔你之后,你会不会再越一次级?!!

第十一点:要善于向上司汇报工作。国家干部是不是 人民的公仆本人不太清楚。但公司里那些大大小小的管理者一定是(如果不是这样那他就不是一个好上司)!那群夹板男,看着是个官,其实过得很苦。既要应付好 上面的领导,又要充分调动下面群众做出业绩,整天搞得焦头烂额。上面的唱白脸,那么夹板男就唱黑脸。总之挺不容易。他们的猜疑心很重!时常会怀疑下面的人 没尽心工作。虽然一般公司都有什么任务分配管理系统,但是那东西远远不够。你需要找准时机让他清楚你工作进展,你所做出的努力。

第十二点:不要轻易造成情绪污染。不要因为你一个人不高兴,而让别人都看你的脸色。要学会雪藏自己的情绪。你若是一个领导,那这一点就太要紧了。

第十三点:一举一动找准自己的位置、别人的位置。比如:吃饭时的座次,照相时的排列位置,群发邮件时收件人的排名顺序,文档作者的位置顺序、、、、、、这些都很重要。《易经》中有讲:明相位,立德业。要是你连自己在哪儿都不知道,你又如何到得了目的地。

第十四点:没有必要做一个愤青。刚毕业那会,我很愤青,看不惯这看不惯那。但是又能怎么样呢?弱肉强食的本质从来没有改变过,你要学会尝试去理解这个社会,理解种种关系。到某个时候你会发现:一切理所当然。你若真的不满意某个现状,那么就去尽自己的能力去改变它。势者,不均也!均则无势。

第十五点:记住别人的善,忘记别人的恶。一个人心 里不应该有太多仇恨,仇恨是别人扔给你的垃圾,你又不是垃圾桶,老装着它做什么?在公司当算法工程师近三年了,别人怎么对我,我的心里跟明镜似的一清二 楚。对我不好的人我并没太在意,更别说去报复。相反,他们有事要我帮忙的时候,我总能真心实意的去帮,甚至主动帮忙解决问题。这是这几年来,我对自己唯一 满意的一点。我相信一句话:活着就是修行。但是你得清楚你修的是善行还是恶行。

毕业三年了,看看走过的路,总觉的有点荒凉。确实真正明白了许多道理。感谢帮助过我的人,也感谢打击过我的人。也许一个人只有亲身经历了困难才可能真正成长起来,由此我不得不感叹造化的残酷。

posted @ 2012-06-20 10:03 writegull 阅读(211) | 评论 (0)编辑 收藏

 感谢雷锋网的投递

编者按:本文作者郭子威,前网易网站产品部总监,想要联系的读者可以在微博上@纯银V。其实,这篇文章是打算写“大公司抄你肿么办?”很明显腾讯最典型嘛,以至于我还在网易的时候,Boss也问我,腾讯抄你怎么办?此时屡屡有一股邪火在胸口燃烧着,想大吼一声:腾讯抄我怎么办?老子跳槽去腾讯!最后我还是选择了创业。


我在网易5年,一直带业务部门,从内容总监转职产品总监,算得上资深中层吧。网易做产品的环境,放在业内大约是中等偏上,它的好处别家未必有,弊端 则是寰球同此凉热。年初跟VC谈天使融资的时候,对方大统领换了一个问法:如果网易抄你怎么办?我很吃惊地回答,如果留在网易就能把这个项目做出来,我还 创什么业?难道你以为我创业是为了发财、专权,或者给自己戴上SB风格的CEO头衔?

那么大公司到底是真老虎还是纸老虎?我得从大公司业务运作的常识说起。

▎部门背景
大公司是一个笼统的概念,由若干个事业部>大部门>中小部门>项目组构成。其中战斗力过硬的项目组是少数,王牌军不足十分之一,而水货项目组的占比至少超过一半。
我们品头论足说XX公司的产品做得很好,其实是某几个项目组实力非凡。如果不与他们正面对抗,其他组做产品也就是60出头的平均分。难道你连产品70分都没有自信?没这自信你还做个屁啊。

所以在忌惮大公司之前,先摸摸底,和你竞争的大公司项目组归属在哪个部门下面,它又是什么背景。正如我以前对某大公司很是好奇,为什么一部分业务很烂,另一部分很赞?内部人士答:因为它们分属于两个不同的事业部,一队落魄边沿化,另一队则是常胜王牌军。

▎业务关联
有些时候,你发现某大公司和你进入了同一个竞争领域。别着急,先看看做这个项目的部门,主营业务是否和该项目在同一条中轴线上。

由于野心的驱动,部门主管常常会批准一些和主营业务关系不大的,想象空间又很大的项目,妄想别错过金矿。然而这只是投石问路,买张彩票,主要的资源 仍然在主营业务线集中,更不可能忍受平缓的增长曲线(掘金心态嘛,哪怕掘到铜矿也会断然放弃)。外界看见“XX公司悍然进入XX领域”……屁嘞,只有做这 个项目的团队甘苦自知,时间紧/期待高/投入少,不挂基本上不可能。
紧接着上一条,对大公司对手的部门背景作详细调查,或许能解除你对那个庞然大物的恐惧心。如我以前在网易门户做摄影分享社区,第一年里,有8个月分到了1 位工程师的工时;接下来一年总算有3位工程师了,其中2位又是实习生。我熬了整整3年,3年呐,才熬到基本够用的技术人员配置,那时市场机遇早已消失不 见。

▎公共资源
大公司的公共资源往往包括如下部分:UED、QA、推广位,集中调度以提高利用率。有时候运营人员也是公共资源,有时候更惨一点,连程序员都是公共资源。 虽然家底殷实,公共资源摊薄到每个项目上便很寒碜,所谓僧多粥少。项目经理可能把自己有招聘权的人给凑齐了,但他还得腆着脸找各个公共部门老大要资源,有 时是恳求,有时是苦苦哀求。

跪下来舔鞋都提不上工单的时候,我以前还使过一茅招,搞点部门经费,请前端组的同事私底下帮忙切图……当作付费外包来对待。那时视觉稿已经堆了个把月,没法推进一步。类似的木桶效应多如牛毛,几乎每个大公司项目都会遇到,偏偏使不上力,被短板卡得上气不接下气。

即便抢到了(勉强够用的)公共资源,你还得面对分配资源的随机性问题。比如说小清新风格的产品,能分到擅长此风格的设计师吗?不能,谁空下来分派 谁。擅长小清新的设计师当然也有,人家正在别的项目组,即便那个项目恶俗,设计师也很不开心,做到一半怎可能中途离场。所以我以前跟PM说:有人帮你做就 快去烧香还愿,有推广位到手就感恩热泪盈眶,你还挑啥子挑喃?十几个部门几十个项目都闹着要最好的最合适的,你让UED情何以堪喃?

由于公共部门采用派单制,大部分人员缺乏项目归属感,荣誉感,他既无法全程参与,也很难真正融入项目组里边。座位经常隔了几百米,一周只能碰头两三 面,甚至因为参与时间短暂,就连对产品的理解也比较浅,应付完这个应付那个,“应付了事”的心态极为常见。往往只有项目经理把产品当儿子看,别人都当成牵 到自己家里来串门的邻居小孩儿。

更能理解的是,公共部门这个月做A项目的单,下个月做B的单,这个月A项目组请饭请求加班,下个月B请饭请求加班。项目上线你们倒是领功/打赏/休 假,下一个项目组又声泪俱下说这单子特别重要,非得拉兄弟一把不可。这岂不是“无穷无尽的加班”“无穷无尽的拼这一仗”?你们少来诳老子……
曾见以前合作的设计师,私底下为自己做了款玩票的APP,比当初花两三个月为我们部门设计的APP,起码高出两个等级。当真刮目相看。

▎KPI

KPI是万恶的,没有KPI又是万万不能的。

所谓KPI,属于体制的一部分,也是大企业病的一部分。这个世界上不靠谱的人和项目占多数,衡量创业团队是否靠谱的标准很简单——剩者为王。这是一款生存游戏。

随着公司活下来并且膨胀起来,自然淘汰的筛选法很快失了效。创业意味着高风险和高收益,当创业团队成长为中型公司,大公司,则个人的风险降低(收入 增加,薪资职位稳定),收益也降低(期权减少甚至没有),容易滋生更多轻浮的冒险,拿公司的钱去玩自己的票,修筑各种烂尾楼。如果不用KPI来制衡,十八 般瞎折腾便掏空公司资源。人家旱涝保收底薪很高的,人家从折腾中赚到了经验值,就算引咎辞职,下一份工作还能拿到更高薪水的,而你老板呢,资产耗光只能去 摆地摊了。

鉴定和约束各种瞎折腾的管理手段之一,我们称之为项目KPI,即阶段性的项目考核。在这个过程中证明自己靠谱,项目有戏,公司才会继续支持你。以我 所见,虽有不少被KPI整死的好项目,但95%以上被涮掉的,确为次品,事后一齐流泪控诉KPI之恶贯满盈,觉得失败原因是“公司不给支持”。问题是怎么 证明你和这个项目值得更多的支持?怎么证明你是有可能成功那5%,而不是注定失败的95%?

老板毕竟不是天网,他不可能什么都懂,尤其对新拓展的业务,一旦超出了高层的成功经验领域,只能靠KPI来判断项目前景。这同时意味着[要命的]公 司对项目缺乏耐心和远见。若不能看到短期数据利好,则支持度快速下降,资源供给减少,方向盘立刻打到一条名为“黄泉”的路上。预见到灭顶之灾又会干扰项目 经理的判断,往往使些目光短浅,饮鸩止渴的茅招出来,苟且保得眼前性命。

▎高层干预

刚才提到大公司对新业务缺乏耐心和远见,这根子还在公司高层身上。所谓高层,最低也是管辖几百人的方面大员,通常从VP起计。能做到大公司高层必有 过人之能,不幸人过30岁后对新领域的学习能力直线下降,再加上行政事务缠身,无法专注于业务。故而对于市场拓展,大部分高层混合了视野狭窄与刚愎自用这 两种特质,必然大量依赖KPI管理。

反过来看,如果高层瞄准了某个项目,下决心赌上一把呢,它就会得到更多的资源和宽容,初期KPI有可能压根不设,所有公共部门都围着你打转。高层力 挺可以解决掉60%的大企业病,作为创业团队,遇到这样的对手是件挺可怕的事情,还好它们只是极少数,占比不足5%。而你会因为大晴天也有可能下雨沾湿 鞋,就畏畏缩缩不敢出门吗?

何况高层的支持是一把双刃剑,他会给你喂足粮草,钉好蹄铁,同时也给你戴上嚼子,圈定方向甚至策略。那么高层指定的方向策略出错呢?恭喜,贵项目挂了。长官意志令如山,最怕长官是外行。

另一些情况下,大公司项目因为资源不足,资源错位而做砸,其实还是高层的决策影响。他认为给这些支持已经足够看清前景,若是败局,又何必豪赌下去。毕竟主营业务还赚钱嘛,还有得选择,反倒是“没得选择”转化为创业团队背水一战的韧性所在。

▎齐心协力

说句听上去挺刺耳的话,大公司里很难谈真正的齐心协力。按我的理解,齐心协力的基石不是个人素质,而是成员都适合这个项目,喜欢这个项目,自然努力 团结。可你加入某一家大公司,往往受其光环/福利/资历的吸引,有个坑就猛往里跳,其后转岗不易。做什么项目亦受到部门限制,自主权有限得很。
换句话说,参与大公司项目组的,并不是最适合,最喜欢这个项目的人,而是项目经理目前能搞到的人(调动、招聘以及公共部门派单)。甚至项目经理本人也是奉 命而为,或无奈抓阄。驱动工作的动力是职业道德,季度考核,奖金与功名,却非你对这款产品的爱。老实承认,我自己即是一例。哪怕在网易加班极多,直到辞职 出来做有爱的产品,方才觉得过去皆是行尸走肉。

而我目前的创业团队只有6个人,来自5家大公司(上市或即将上市)。你说大家放弃了高薪福利,稳定工作,来上海做一款前途未卜的产品是为什么?当然不是服了我的三尸脑神丸……

于是我现在的项目速度比之前在网易快3倍,工作进展有规划,无管理,队员的主动性之强,内部合作的愉快与默契是过去从未经历过的。两个字:“开心”。换回大公司,那得打多少鸡血开多少动员大会啊,最后有人还在会上睡着了。

▎人多嘴杂

小团队凭什么跟大公司竞争呢?有人说是“专注”,有人说是“耐心”,有人说是“远见”。这些都对,我还要补充一点,小团队一定要比大公司犯更少的错。

这句话听上去挺莫名其妙的,大公司人才济济,小团队凭什么跟人家比正确率?回答很简单:人才济济,同时也人多嘴杂。给项目提意见的人越多,执行效率 越低,这是铁一般的定律。尤其当建议者中包括各级领导的时候,决断就更加飘忽不定。你非得考虑上司的立场,部门的立场,微妙的公司政治环境,固然不乏真知 灼见,合拢在一起便成噪音干扰。大量时间花费在报审/修改/开会/争吵/写文档/走流程上面,行动迟缓举棋难定,更增加误入歧途的概率。

相比之下,小团队的快速决策,快速行动,正好击中了大公司的软肋。一款新产品出来,大公司实权派发现它起码得2个月,看懂它2个月,立项组好队还得 花2个月。再加上市场前景不明朗,在创新者大红大紫之前,大公司愿意投入(冒险)的资源是极少的,试水而已,复制抄袭多于革新改良,保守跟随多于锐意开 拓。结果一两年过去了,创新者勇猛精进已成气候,大公司才回过神来,欲与之全力一搏。人家的前期积累已领跑市场,后来者未必追赶得上。

类似案例,多不胜数。创业者眼里唯一的好机会,大公司看来却只是1000个模糊不清的机会之一,拿捏不定。由此逆向思维的话,创业团队最好不要插入 大公司的主营业务去虎口夺食。人家苦心经营多年,凭借对这块市场的理解力和戒备心,会更快发现你,重视你,然后高层吹响号角击溃你。但你去开辟新战场呢, 大公司跟还是不跟,用多大力跟,往哪个方向走,它就很难统一内部意见。

▎基因转移

人都艳羡大公司“资源多”,所谓资源,一半是人才资源,一半是海量用户,即推广资源。然而不常被提及的是,大平台的团队基因/用户构成/用户习惯,与新项目是否吻合。或者笼统点说,大平台的资源优势是否能向新项目平滑过渡。

我一直是“基因论”的支持者,公司实权派的个人偏好,决定了团队构成与文化,进而决定了主场优势与劣势。正如APPLE在社交网络几战皆败,伟大如 Google也被Facebook压得抬不起头来。只是受到野心蛊惑,即便八字不合,大公司也会悍然进入新领域(凭什么我不行),随后又惨然退出(原来我 真不行)。

比团队基因更令人恼火的,是用户基因,即当前用户群的构成与使用习惯。做产品经常遇到“跨域”这个问题,借势推广也一样。新项目的产品诉求,用户构 成,如果和母体在同一个域内,则资源优势平滑过渡,对竞争者是致命的杀伤力。但其实……平滑过渡又是一件特别不多见的事情。有时新项目整个的跨域,比如腾 讯做拍拍,做朋友,导入损耗率惊人;有时大平台向垂直市场细分,无法精准过滤推广目标,导入用户良莠不齐得厉害,对于重视“气质、氛围”的垂直市场则是拔 苗助长。

以我之前做网易摄影为例,不推吧,在大公司做产品跟创业有多大区别,生怕浪费了资源。推吧,不搭边的人路过都来踩一脚,各种低端用户、自拍用户、审 美低下热情万丈的中老年用户蜂拥而入,氛围混乱,运营成本指数级上升,最终受困多过受益。反倒是独立摄影产品如图虫,用户气味相投而来,自然增长营造的社 区气质远胜从大平台引流,气质恰恰又是社区的核心竞争力。

做产品,鲜有一夜暴富,尤其UGC,口碑带动增长才是最稳健的方法。道理固然大路货,KPI压力下却容易急于求成。母体供血一旦大量掺水,相当于修 炼邪道武功,起步快而后力不济,很快会触碰到天花板。这时大平台所谓海量用户,反倒成为盛满鲜花的陷阱,涂抹蜜糖的慢性毒药。好似小时候四环素治病,长大 后灿然一笑露出满口黄牙。

总之,在大公司里做产品的雷区多多。与内部环境作战所使的力气,往往占到血槽的2/3强,只留下不足1/3去对付市场。它抄你,不见得就打得过你。 它是个大家伙,但也喜欢把两个脚拇指绑起来走路。在多数情况下,大公司的新项目只是全身挂满钻石镣铐的,虚弱的巨人,被它抄死多半说明你太逊色,而不是大 家伙太凶恶。
不过,这个行业的主流论调并不这么看。

最近几个月,各式各样的人纷纷来问我,既然立志创新,大公司抄你怎么办?

对这个问题,我有各种具体的回答,但都不是真心话。只是面对某些人,比如投资人的时候,你跟他讲虚的,会被当成喷子,得表示我有明确的对策……其实对策易变,反倒是“产品哲学”这类虚的东西更加恒定。

我真心的态度可以用三次自问自答来概括。

1、我的产品质量能不能打败跟随者,至少是与跟随者各擅其长?

如果做不到,这不是我被抄的问题,是我太挫,我认栽。竞争会刺激我提高产品质量,未必是一件坏事。

2、假定产品通过创新,打开一个新的细分市场,这个市场是否足够大,大到可以容纳下多个竞争者同时生存?

如此则对手亦是队友,我们一边互相作战,一边共同开垦荒地,联手培育市场。即便最后我只拿到第三、第四的份额,也不错啊,谁规定创新者就非得独吞整个市场不可——初夜权不等于占有权,市场又不是从一而终的贞洁牌坊。

3、除了用户口碑之外,产品是否有具象化的的价值沉淀?

比如黏性强的用户关系,比如用户留存的他看重的内容,比如有忠诚度的优质内容发布者,比如含金量与时效性较长的信息。这些沉淀即防御壁垒,从产品架构阶段就应该提前考虑,决定了防守反击的难度。

所以别人来不来抄这种事情,我从来都是不大关心的,偶尔想想,从不忧虑。周鸿祎有句话说得很好,少盯着对手,多研究用户。一天到晚担心“腾讯抄我怎 么办”?担心有屁用啊,万一产品做得不好,腾讯抄都不屑于抄,那得白白浪费多少脑能量。我只管埋头做自己的产品,洪兴罩我去战斗~

换个角度看,哪怕比较倒霉,很快被大公司看得起并临幸了,对手在高层力挺下全力以赴地复制并改良,它的基因刚好又平滑过渡……那么,我挂了。但产品 创新若是如我所愿地打开某个细分市场,改善某类用户体验,作为始作俑者,老子倾家荡产,虽败犹荣。“小小改变世界”比“赚到一千万”更值得追求。

正如我在微博里所说:阻挡你创新的是“无能”而不是“抄袭”,鼓舞你创新的是内心骄傲而不是永远独占鳌头。

文/benimaru zhang

posted @ 2012-06-14 10:08 writegull 阅读(222) | 评论 (0)编辑 收藏

openURL的使用方法:[[UIApplication sharedApplication] openURL:[NSURL URLWithString:appString]];
其中系统的appString有:
1.Map http://maps.google.com/maps?q=Shanghai 
2.Email mailto://myname@google.com 
3.Tel tel://10086 
4.Msg sms://10086 


openURL能帮助你运行Maps,SMS,Browser,Phone甚至其他的应用程序。这是iPhone开发中我经常需要用到的一段代码,它仅仅只有一行而已。

//打开地图

- (IBAction)openMaps {
NSString*addressText = @"beijing"; //@"1Infinite Loop, Cupertino, CA 95014"; 
addressText =[addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
NSString*urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",addressText]; 
NSLog(@"urlText=============== %@", urlText); 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
}

//打开mail

- (IBAction)openEmail { 

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];

 }


//拨打电话 

- (IBAction)openPhone {

 [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8004664411"]]; 

}

使用这种方式拨打电话时,当用户结束通话后,iphone界面会停留在电话界面。
用如下方式,可以使得用户结束通话后自动返回到应用:
UIWebView*callWebview =[[UIWebView alloc] init];
NSURL *telURL =[NSURL URLWithString:@"tel:10086"];// 貌似tel:// 或者 tel: 都行
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
//记得添加到view上
[self.view addSubview:callWebview];

 还有一种私有方法:(可能不能通过审核)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://10086"]];


//打开短信

- (IBAction)openSms { 

[[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"sms://466453"]];

}


//打开浏览器

-(IBAction)openBrowser { 

[[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]]; 

}

posted @ 2012-06-13 17:09 writegull 阅读(590) | 评论 (0)编辑 收藏

北京时间6月9日消息,据外国媒体报道,谷歌在招聘员工和工程师时,往往会问应聘者有关技术方面的问题。苹果却大不相同,总是会司会问一些脑筋急转弯风格的问题,提出一些与硬件规格相关的问题,此举似乎更多的是希望从潜在的员工身上挖掘更多的创造力。苹果的这些问题不仅针对技术人员,甚至还针对销售人员和其他特殊人员。以下就是美国网站GlassDoor提供的苹果在面试应聘人员的最有趣味性的15道题目:

  1、桌上放置了一部旧iPhone,你能看到哪些材料?

  招聘职位:产品设计工程师。

  在苹果公司工作的多数员工,都会了解供应链的成本事务,以确保尽可能地减少生产手机的产品成本。苹果手机是极具价格竞争优势的产品,所以你必须知道如何从事控制成本相关的工作。因此,具备专业的材料及其属性相关的经验将有助于你在生产手机设备时降低成本。

  2、描述使用苹果产品的情况

  招聘职位:销售员。

  如果你想销售苹果产品,最好已经是苹果用户。无论如何,苹果不会聘用一个从未使用苹果iPhone手机的人来担任公司的销售员工。

  3、如果测试部门否决了500台洗衣机,那么你将如何查找根源并找到解决之道?

  招聘职位:产品质量工程师。如果在生产中发生了故障,就可能会导致数百部iPhone手机受损,甚至也可能会此起成千上万的收入受损。如果你想管理产品质量,那么就必须确保你能够发现所有产生的问题,特别是那些在供应链初期阶段就出现的问题。

  4、你如何在资源非常有限的环境下将处理网络、文件系统、用户界面系统等的线程模型转化成用户空间框架?

  招聘职位:软件工程师。

  编写运营程序的代码较为容易,但是要让它有效的工作就会很难了,特别是当你为手机设计软件时,你必须依赖低功率的芯片来确保电池寿命延长。

  5、你如何计算来自中国的苹果供应量?

  招聘职位:材料项目经理。

  他们正在探讨字面意义上的苹果,如你所知,就是水果。不过,这也是一道非常基础的供应问题。如果你负责管理供应链,那么你就需要确切的知道供应 商供应何种产品、以及能够提供什么样的材料。苹果公司几乎为其生产的智能手机购买所有最好的元件,如果你能够充分了解整个供应链,那就能够减少成本。

  6、使用运营放大器来设计一个LED驱动

  招聘职位:硬件工程师。

  通常情况下,产品不会在非常优化的环境下运行。事实上,运行环境要么太热、要么太冷、甚至还会在水中。因此,你必须确保你的产品能够在非最优化的环境下运行。

  7、如何诊断缓冲溢出问题?

  招聘职位:软件工程师。

  通常情况下,确定谁是最有才华工程师的最佳方法就是问他们如何去解决问题。缓冲溢出问题一旦产生,就可能会引发巨大灾难,因此,如果你想测试你的工程师在极端复杂问题面前如何采取什么行动的话,那么这将是值得提问的好问题。

  8、你有100个编号的灯泡,在第一环节中都打开这些灯泡,然后再换上其它的新灯泡,依次类推,这样100次过后,还有多少个灯泡在亮着?

  招聘职位:高级软件工程师。

  实际上,苹果的面试官并不是最传统的人,他们会从Khan Academy网站引用一些脑经急转弯风格的问题,但是,这些问题一般都是涉及一些数学技巧的复杂问题,因此,要想测试一个工程师解决问题的能力,这些问题都将是值得提出的好问题。

  9、你如何及时地关注科技新闻?

  招聘职位:Mac人才。

  如果你想运营苹果零售商店,那么还需要确保你具备一种认知感觉——即了解人们如何从新闻中理解苹果公司。苹果的面试官想以此了解应聘人员是否会浏览TechCrunch、heck或Business Insider之类的网站。

  10、你从一个6×6的网格的左上方开始,可以向下或者向右移动,那么你会有多少种方法能够到达网格的右下角?

  招聘职位:高级软件工程师。

  这是一个叫作“路径计算”的问题,也是最基本的一种脑筋急转弯问题,这样的问题旨在测试应聘人员如何思考问题,以及能否找到解决问题的方法。苹 果会向他们的部分高级软件工程师提出一些更加疯狂的此类问题,这一点也不足为奇。这样的问题也取自于Khan Academy。

  11、你如何检验表面曲率的连续性?

  招聘职位:CAD制图员。

  苹果为自己的设备绘制了大量的原型——例如iPhone和iPad的原型等。那些原型都需要进行测试,因此,你需要让一些人快速的绘制出原型。但是,还要保证与苹果的其它设备保持一致,因此,你需要确保你的制图员和设计师具备完美的意识,甚至设计玻璃的形状。

  12、找到链接列表的中间点

  招聘职位:Cocoa camp。

  苹果会要求他们的软件工程师提供一个更明智的解决方案。例如,你可能会获得两个“指示器”,一个指示器在链接列表中每次移动一步,另一个每次移动两步。当另一指示器到达终点时,那么第一个指示器所处的位置就是链接列表的中间点。

  13、如果你可以带一件科技产品到偏远的地方,那会是什么?

  招聘职位:专员。

  这是一个带有“欺骗性”的问题,苹果可能是在测试你是否喜欢iPhone手机。在苹果店的销售人员(苹果店专家就是干这个的)必须非常喜欢苹果产品。

  14、在金属片上打出5个洞眼的方法?

  招聘职位:产品设计工程师。

  苹果需要确保其设计师和硬件工程师至少都具备一定的创造力,即使他们必须成为超级技术专家,因此,即使是让你在金属片上打洞这样的简单问题也可能会有很多的解决方法。事实上,苹果是在测试应聘人员的创造力。

  15、你认为中学里什么样的群体最好或最简单?

  招聘职位:专员

  如果你想在苹果商店中挑出那些更可能购买苹果产品的专门用户,你就需要具备了解这些用户是什么样的人,无论他们是否购买苹果产品,你都需要作出记号,并尽可能快地区别出来。 

 

posted @ 2012-06-09 14:23 writegull 阅读(313) | 评论 (0)编辑 收藏


屏幕快照 2010-12-27 上午10.20.03

实现如下代码:

- (void)viewDidLoad {
[super viewDidLoad];
segmentedControl=[[UISegmentedControl alloc] initWithFrame:CGRectMake(80.0f, 8.0f, 70.0f, 25.0f) ];
[segmentedControl insertSegmentWithTitle:@"T+" atIndex:0 animated:YES];
[segmentedControl insertSegmentWithTitle:@"T-" atIndex:1 animated:YES];
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentedControl.momentary = YES;
segmentedControl.multipleTouchEnabled=NO;
[segmentedControl addTarget:self action:@selector(Selectbutton:) forControlEvents:UIControlEventValueChanged];
UIBarButtonItem *segButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];
[segmentedControl release];
self.navigationItem.rightBarButtonItem = segButton;
[segButton release];

}

-(void)Selectbutton:(int)sender{
UISegmentedControl *myUISegmentedControl=(UISegmentedControl *)sender;
NSLog(@”!!!!!!!!%d”,myUISegmentedControl.selectedSegmentIndex);
switch (myUISegmentedControl.selectedSegmentIndex) {
case 1:
break;
case 0:
break;
default:
break;
}
}

segmentedControl 中的字体也是可以改动的,代码如下:

-(void)ChangeSegmentFont:(UIView *)aView
{
if ([aView isKindOfClass:[UILabel class]]) {
UILabel *lb = (UILabel    *)aView;
[lb setTextAlignment:UITextAlignmentCenter];
[lb setFrame:CGRectMake(0, 0, 80, 25)];
[lb setFont:[UIFont systemFontOfSize:18]];
}
NSArray *na = [aView subviews];
NSEnumerator *ne = [na objectEnumerator];
UIView *subView;
while (subView = [ne nextObject]) {
[self ChangeSegmentFont:subView];
}
}

在需要调用此方法的地方加入下面方法即可(分段控件中已经有分段按钮时调用)

[self ChangeSegmentFont:UISegmentedControl的对象];

即可

posted @ 2012-05-03 17:34 writegull 阅读(4406) | 评论 (0)编辑 收藏

文章出处:http://blog.csdn.net/iukey

UIKit提供了一组控件:UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、UIPageControl分页控件。

控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏、表格单元,甚至更大的对象。

这些控件的基类均是UIControl,而UIControl派生自UIView类,所以每个控件都有很多视图的特性,包括附着于其他视图的能力。所有控件都拥有一套共同的属性和方法。

所以学习控件,我们先学习UIControl。

属性

enabled

控件默认是启用的。要禁用控件,可以将enabled属性设置为NO,这将导致控件忽略任何触摸事件。被禁用后,控件还可以用不同的方式显示自己,比如变成灰色不可用。虽然是由控件的子类完成的,这个属性却存在于UIControl中。

selected

当用户选中控件时,UIControl类会将其selected属性设置为YES。子类有时使用这个属性来让控件选择自身,或者来表现不同的行为方式。

contentVerticalAlignment

控件如何在垂直方向上布置自身的内容。默认是将内容顶端对其,对于文本字段,可能会改成UIControlContentVerticalAlignmentCenter。对于这个字段,可以使用下列诸值:

  1. UIControlContentVerticalAlignmentCenter  
  2. UIControlContentVerticalAlignmentTop  
  3. UIControlContentVerticalAlignmentBottom  
  4. UIControlContentVerticalAlignmentFill  
contentHorizontalAlignment

水平对齐方式,可以只用下列值:

  1. UIControlContentHorizontalAlignmentCenter  
  2. UIControlContentHorizontalAlignmentTop  
  3. UIControlContentHorizontalAlignmentBottom  
  4. UIControlContentHorizontalAlignmentFill  

事件通知

UIControl类提供了一个标准机制,来进行事件登记和接收。这令你可以指定你的控件在发生特定事件时,通知代理类的一个方法。如果要注册一个事件,可以使用addTarget方法:

  1. [ myControl addTarget: myDelegate   
  2.             action:@selector(myActionmethod:)  
  3.             forControlEvents:UIControlEventValueChanged ];  
事件可以用逻辑OR合并在一起,因此可以再一次单独的addTarget调用中指定多个事件。下列事件为基类UIControl所支持,除非另有说明,也适用于所有控件。

UIControlEventTouchDown

单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。

UIControlEventTouchDownRepeat

多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。

UIControlEventTouchDragInside

当一次触摸在控件窗口内拖动时。

UIControlEventTouchDragOutside

当一次触摸在控件窗口之外拖动时。

UIControlEventTouchDragEnter

当一次触摸从控件窗口之外拖动到内部时。

UIControlEventTouchDragExit

当一次触摸从控件窗口内部拖动到外部时。

UIControlEventTouchUpInside

所有在控件之内触摸抬起事件。

UIControlEventTouchUpOutside

所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。

UIControlEventTouchCancel

所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。

UIControlEventTouchChanged

当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。

UIControlEventEditingDidBegin

当文本控件中开始编辑时发送通知。

UIControlEventEditingChanged

当文本控件中的文本被改变时发送通知。

UIControlEventEditingDidEnd

当文本控件中编辑结束时发送通知。

UIControlEventEditingDidOnExit

当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。

UIControlEventAlltouchEvents

通知所有触摸事件。

UIControlEventAllEditingEvents

通知所有关于文本编辑的事件。

UIControlEventAllEvents

通知所有事件。

除了默认事件以外,自定义控件类还可以用0x0F000000到0x0FFFFFFF之间的值,来定义他们自己的时间。

要删除一个或多个事件的相应动作,可以使用UIControl类的removeTarget方法。使用nil值就可以将给定事件目标的所有动作删除:

  1. [ myControl removeTarget:myDelegate   
  2.                   action:nil  
  3.                   forControlEvents:UIControlEventAllEvents];  
要取得关于一个控件所有指定动作的列表,可以使用allTargets方法。这个方法返回一个NSSet,其中包含事件的完整列表:

  1. NSSet* myActions = [myConreol allTargets ];  
另外,你还可以用actionsForTarget方法,来获取针对某一特定事件目标的全部动作列表:
  1. NSArray* myActions = [ myControl actionForTarget:UIControlEventValueChanged ];  

如果设计了一个自定义控件类,可以使用sendActionsForControlEvent方法,为基本的UIControl事件或自己的自定义事件发送通知。例如,如果你的控件值正在发生变化,就可以发送相应通知,通过控件的代码可以指定时间目标,这个通知将被传播到这些指定的目标。例:

  1. [ self sendActionsForControlEvents:UIControlEventValueChanged ];  
当委托类得到事件通知时,他将收到一个指向事件发送者的指针。下面的例子用于处理分段控件的事件,你的动作方法(action method)应遵循类似的处理方式:

  1. -(void) myAction:(id)sender{  
  2.        UISegmentedControl* control = (UISegmentedControl*)sender;  
  3.        if(control == myControl1){  
  4.         /*查询控件得值*/  
  5.       /*响应myControl1的动作*/  
  6.        }  
  7. }  

此文到此结束,如果你能耐心看看这篇文章,对你后面具体的控件会有事半功倍的效果。
posted @ 2012-04-28 17:21 writegull 阅读(2894) | 评论 (1)编辑 收藏

保存你的私钥,转移到其它系统

将你的私钥安全的保存,如果你需要在多台电脑上开发或者重装你的操作系统的。如果没有私钥,那么将无法再Xcode签名或者在apple设备上测试应用。当一个CSR被生成,Keychain Access应用在你的登录keychain里面生成一个私钥,这个私钥是和你的用户账户关联的,如果在系统重装的时候是无法重新生成的。如果你希望在多个系统上做开发或者测试,那么你需要在所有你工作的系统之上导入你的私钥。

1、 导出私钥和数字证书是为安全保存和能够在多台电脑上进行工作。打开Keychain Access应用选择’KEY’分类。

2、 右键点击和你iphone开发证书关联的私钥,并在弹出菜单中选择导出选项。

3、 使用(.p12)保存包含了你个人信息的钥匙。

4、 你将会被提示创建一个密码。

现在可以通过.p12文件在不同系统之间传输。双击.p12在其他系统上进行安装。输入你在step4输入的密码。

posted @ 2012-04-27 10:40 writegull 阅读(619) | 评论 (0)编辑 收藏

   在编译好的真机版目录下的.app文件,至于生成真机可以运行的app的方法,有两种方式,一种是交99美元获得一个证书,另外一种是破解的方式,在此不再详述,本文假设你已经生成了真机上可以运行的app包了(app包实际上是一个文件夹

   假设此安装包的名称是 hello.app,点击右键,选择 显示包内容,这样就可以打开这个hello.app文件夹了,在此文件夹中有一个info.plist文件,打开它,新增加一个名为SignerIdentity的key字段,内容为Apple iPhone OS Application Signing。

然后将.app拖到itunes就生成ipa了.默认名字应该是hello.ipa

如果要将此ipa分发出去,可以在itunes中的hello.ipa文件上点击鼠标右键,选择 在finder中显示,就可以得到生成后的ipa安装文件了

posted @ 2012-04-26 09:50 writegull 阅读(1176) | 评论 (0)编辑 收藏

1.在Windows下打开/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.1.sdk/SDKSettings.plist ,找到CODE_SIGNING-REQUIRED 将它对应的值改为NO。

2.打开Xcode创建/打开一个项目,把Code signing identity和Any ios 对应的值改为Don’t Code Sign 

3.Build and Run!Enjoy!
posted @ 2012-04-26 09:42 writegull 阅读(229) | 评论 (0)编辑 收藏

1.程序图标app icon ------ 普屏 icon.png[57*57] 视网膜屏icon@2x.png[114*114]

iPhone开发中经常用到的控件尺寸大集合

Sizes of iPhone UI Elements


iPhone UI 设计的一些标准尺寸1 - 懒得喘气 - 懒得喘气的博客
ElementSize (in points)
Window (including status bar)320 x 480 pts
Status Bar
(How to hide the status bar)
20 pts
View inside window 
(visible status bar)
320 x 460
Navigation Bar44 pts
Nav Bar Image /
Toolbar Image
up to 20 x 20 pts (transparent PNG)
Tab Bar49 pts
Tab Bar Iconup to 30 x 30 pts (transparent PNGs)
Text Field31 pts
Height of a view inside 
a navigation bar
416 pts
Height of a view inside 
a tab bar
411 pts
Height of a view inside 
a navbar and a tab bar
367 pts
Portrait Keyboard height216 pts
Landscape Keyboard height140 pts
Points vs. Pixels
The iPhone 4 introduced a high resolution display with twice the pixels of previous iPhones. However you don't have to modify your code to support high-res displays; the coordinate system goes by points rather than pixels, and the dimensions in points of the screen and all UI elements remain the same.
iOS 4 supports high resolution displays (like the iPhone 4 display) via the scale property on UIScreen, UIView, UIImage, and CALayer classes. If the object is displaying high-res content, its scale property is set to 2.0. Otherwise it defaults to 1.0.
All you need to do to support high-res displays is to provide @2x versions of the images in your project. See the checklist for updating to iOS4 or Apple documentation for Supporting High Resolution Screens for more info.
Adjusting Sizes
Click here to see how to adjust View Frames and Bounds.
Additional References
Table 8-1  Custom icons and images

Description

Size for iPhone and iPod touch (in pixels)

Size for iPad (in pixels)

Guidelines

Application icon (required for all apps)

57 x 57

114 x 114 (high resolution)

72 x 72

“Application Icons”

App Store icon (required for all apps)

512 x 512

512 x 512

“Application Icons”

Launch image (required for all apps)

320 x 480

640 x 960 (high resolution)

For portrait:

  • 768 x 1004

For landscape:

  • 1024 x 748

“Launch Images”

Small icon for Spotlight search results and Settings (recommended)

29 x 29

58 x 58 (high resolution)

50 x 50 for Spotlight search results

29 x 29 for Settings

“Small Icons”

Document icon (recommended for custom document types)

22 x 29

44 x 58 (high resolution)

64 x 64

320 x 320

“Document Icons”

Web clip icon (recommended for web apps and websites)

57 x 57

114 x 114 (high resolution)

72 x 72

“Web Clip Icons”

Toolbar and navigation bar icon (optional)

Approximately 20 x 20

Approximately 40 x 40 (high resolution)

Approximately 20 x 20

“Icons for Navigation Bars, Toolbars, and Tab Bars”

Tab bar icon (optional)

Approximately 30 x 30

Approximately 60 x 60 (high resolution)

Approximately 30 x 30

“Icons for Navigation Bars, Toolbars, and Tab Bars”

Newsstand icon for the App Store (requiredfor Newsstand apps)

At least 512 pixels on the longest edge

At least 512 pixels on the longest edge

“Newsstand Icons”

posted @ 2012-04-26 09:31 writegull 阅读(8943) | 评论 (0)编辑 收藏

如果我们在Hibernate中需要查询多个表的不同字段,如何来获取结果呢?
有两种方式:
1、 对各个字段分别转化成对应类型,如下:

Java代码
  1. Query session.createQuery(select members, classInfo.className "    
  2.     from Members members, ClassInfo classInfo "    
  3.     where members.level classInfo.classCode ");    
  4.   
  5. List result q.list();    
  6. Iterator it result.iterator();    
  7. while (it.hasNext())    
  8.    Object[] tuple (Object[]) it.next();    
  9.    Members members (Members) tuple[ 0 ];    
  10.    String className (String) tuple[ 1 ];    
  11.  
 

2、构造自己的复合类型,如下:

Java代码
  1. Query session.createQuery(select new NewMembers(members, classInfo.className) "    
  2.     from Members members, ClassInfo classInfo "    
  3.     where members.level classInfo.classCode ");  

当然我们需要有一个NewMembers类和相应的构造方法。

posted @ 2012-04-24 09:34 writegull 阅读(543) | 评论 (0)编辑 收藏

有时我们写个代码开源出来给别人用时,会被其他开发者抱怨编译不了,很多情况是版本的问题,尤其现在ARC的出现后关于weak,strong的问题让人头疼。
有个开源代码这里做的很不错,就是MBProgressHUD
看下他是怎么做的:

  1. #ifndef MB_STRONG
  2. #if __has_feature(objc_arc)
  3.     #define MB_STRONG strong
  4. #else
  5.     #define MB_STRONG retain
  6. #endif
  7. #endif
  8.  
  9. #ifndef MB_WEAK
  10. #if __has_feature(objc_arc_weak)
  11.     #define MB_WEAK weak
  12. #elif __has_feature(objc_arc)
  13.     #define MB_WEAK unsafe_unretained
  14. #else
  15.     #define MB_WEAK assign
  16. #endif
  17. #endif

非ARC的retain,相当于ARC的strong
iOS5的ARC中weak能在销毁时自动赋值nil,这是iOS4.x上使用ARC不具备,所以用的unsafe,非ARC自然是assign

posted @ 2012-04-23 15:49 writegull 阅读(1416) | 评论 (0)编辑 收藏

release 是将内存引用计数-1  nil 直接赋值为0   除非这个指针指向的空间被释放  否则就是内存泄露

nil是表示0x0,可以理解为空指针。release是释放内存。
例如:你开辟了一块内存p=[[nsobject alloc] init]; 这个时候p是指向这块内存区域的,如果你直接p=nil,会造成这块内存没有被释放,内存泄露。 如果[p release]释放了内存,但是p还是指向这个内存地址,如果在操作p会出现EXC_BAD_ACCESS。正确的做法应该是释放后,把p指向nil
posted @ 2012-04-20 17:40 writegull 阅读(475) | 评论 (0)编辑 收藏

概述

UIView对象在屏幕中定义了一个复杂区域和界面来管理这个区域的内容

视图的职责:
画图和动画。
布局和子视图管理。

事件处理。

 

1、创建一个视图对象

CGRect viewRect = CGRectMake(10,10,100,100);
UIView* myView = [[UIView alloc] initWithFrame:viewRect];
[self.window addSubview :myView];//将视图作为子视图添加到window中

2、动画

改变一些视图属性将会使用到动画,改变属性时创建一个动画,用于给用户传递在较短时间内的变化。UIView类做了动画展现的大部分工作,但是你仍然需要声明哪种属性改变的时候,你需要动画效果。有两种不同的类型来初始化动画
下面的UIView属性支持动画:
frame,bounds,center,transform,alpha,backgroundColor,contentStretch
在iOS 4之后,使用block-based动画方法(推荐使用)
使用 开始/提交方式(begin/commit)

3、管理视图的层次结构

superview属性:
subviews属性:
window属性:
-addSubview方法
-bringSubviewToFront:(UIView *)veiw方法,将view视图移到层次结构的最顶端,使得其得以展示
-sendSubviewToBack:(UIView *)veiw方法,和上面方法正好相反
-removeFromSupview方法,
-insertSubview:(UIView *)view atIndex:(Interger)index方法
-insertSubview:(UIView *)view aboveSubview(UIView *)siblingView 方法
-insertSubview:(UIView *)view belowSubview(UIView *)siblingView 方法
-exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2方法
-isDescendantOfView:(UIView *)view方法,判断view是不是指定视图的子视图

4、子视图的布局(layout)

-layoutSubviews方法,这个方法,默认没有做任何事情,需要子类进行重写
-setNeedsLayout方法
-layoutIfNeeded方法,立即对子视图进行布局

5、画/更新视图

-drawRect:(CGRect)rect方法
-setNeedsDisplay
-setNeedsDisplayInRect:(CGRect)invalidRect方法

6、以块展现动画的方式(animating views with block)

+ animateWithDuration:delay:options:animations:completion:
+ animateWithDuration:animations:completion:
+ animateWithDuration:animations:
+ transitionWithView:duration:options:animations:completion:

+ transitionFromView:toView:duration:options:completion:

7、在视图和坐标系统之间转换

-convertPoint:toView
-convetPoint:fromView
-convertRect:toView
-convertRect:fromView

8、跟踪视图相关的改变

-didAddSubview:
-willRemoveSubview:
-willMoveToSuperview
-didMoveToSuperview
-willMoveToWindow:
-didMoveToWindow
posted @ 2012-04-20 10:37 writegull 阅读(9668) | 评论 (0)编辑 收藏

     摘要: 目前做的一个项目里用到了提示音,但是又不想添加提示音到库里,便开始研究调用系统自带的提示音,最后终于找到了。开始在CC上查发现好像很多人都在问,但没人回答,我就把自己查到的东西和写的一个demo给大家分享下吧首先要在工程里加入Audio Toolbox framework这个库,然后在需要调用的文件里#import <AudioToolbox/AudioToolbox.h>最后在需要播...  阅读全文
posted @ 2012-04-16 14:23 writegull 阅读(1958) | 评论 (0)编辑 收藏