1.进入开发者中心,进入到iOS Provisioning Portal界面,然后进入app ids界面创建一个专为发布软件用的appid,并为其创建证书
第一栏随便写,第二栏必须按格式,什么是按格式?可能很多第一次发步的同学不太清楚,就是不要写一个固定的appid,要在最后用*,*代表的是任何字符,就是你的应用程序可以用任何字符。第二栏如果你不知道怎么写,我给个例子:(com.csc.*),括号里面的.这里错了,你后面都是徒劳。创建完后再添加一个证书,发布证书,必须是管理员身份,组员身份没有Distribution,无法发布
Profile Name随便写,app id选择你为发布创建的app id,创建好了之后要刷新一下才会更改状态,然后更新下
2,发布应用时需要选择iOS Device。点击 Edit Scheme... 以编辑Archive选项,它的默认 编译配置为Distribution 并且将归档显示在Organizer中
然后
将内容改成Distribution
3.配置TARGETS里面的Summary的Bundle Identifier,TARGETS里面的Build Settings的Code Signing Identity,PROJECT里面的Build Settings的Code Signing Identity这三部分匹配,(具体怎么算匹配在文章最下面已经补充,如果在出错后可以看下,这里的话还是按照顺序一步一步做),然后进入Product菜单->Archive,然后会自动弹出Organizer,Archive包是用来上传到AppStore的
4.如果看到的是上面的界面,那是正常的,因为你还没告诉苹果公司你要上传你的软件,苹果公司没准备好接收你的软件,那你接下来的是登陆开发者中心,登陆IOS Dev Center的iTunes Connect,然后点击Manage Your Applications,然后点击Add New App ,(第一次发布的时候有一个界面选择公司和语言,我是随便写的,好像没什么区别)然后开始配那些项,这个没什么难度,一看就懂,按照要求写上去就行
10月17日补充,由于ios6的推出,苹果在开发者网站上有了一些变动,在填写信息的时候有个朋友纠结了3天也没弄好,最后直接Q我,我就直接帮他做了。我就把如何填写的信息完整的发出来吧
可能在这里填写的时候,要注意一下,如果之前appid如果不是用*,可能看不到以下界面,这个要去重新新建一个appid,然后更新发布证书,指向那个appid,如果你看到的是下面的界面,那么就不需要新建了,然后在Bundle ID Suffix这一栏写上你的应用程序名,这一栏非常重要,与你Xcode上的程序名要一致才能上传
这个界面没什么要填的,就是选择价格,一般都是免费软件,收费的同学一般都有“管”级别的同学在弄,一般不会看这个,呵呵。选择完就继续。
这个部分填写的时候没什么需要注意的地方,当然越准确越好,但是就上传而言,不会有太过严肃的审核,可能有时候要选择primary category,一般都是business,其他视自己需要和实际情况。
这个部分一般全部选none就好,如果你的程序确实有涉及一些不健康的或者暴力的,那就需要仔细看看了
这个部分将会在软件通过后显示在appstore界面的正文部分,虽然在上传的时候审核的不强,但是还是要认真填写,其他带选择性填写的,如果有的话,最好还是填上去。
这个界面是ios6之后新加的,之前上传的时候是没有的,那些数据怎么填写的呢,邮箱就是你的登陆邮箱,名称就是你填写的用户名,我的是
你也可以点击Edit Profile查看你填写的一些信息,你也可以看到
suntiezheng不是我的名字,哈,是我们老大的。
接下来的,你要准备一个在苹果商店显示的图标,当然是炫一点好,是用户的第一印象,然后就是要有截图,按照标准,点击旁边的问号查看有什么要求,至少要一张截图,如果你要兼容iphone 5 ,那也要iphone5的截图。
5如果抖按照要求顺利提交,你的邮箱会收到苹果公司的一封邮件,告诉你现在是Prepare for Upload这个状态,然后在点击Ready to Upload Binary之后,状态会变成Waiting For Upload,到现在就可以回到Xcode上传软件了,就是进入Product菜单->Archive,
6.看到这个界面就可以松一口气了,这是苹果公司告诉你你可以上传了然后点击Finish,然后回到Organizer-Archives界面,选择Distribution按钮,会有如下界面
然后点Next,然后继续点,直到上传
到这个时候你要做的就是等待了,当上传完成的时候你会收到邮件,通知你Waiting For Review。也就是大功告成。
我的qq:915893620,喜欢傻瓜式的文章
可能第一次发布的时候有各种困惑,
1:到底怎么样算配置好各种参数?其实很简单,只要把证书设置为专门发布的证书即可,没有网上说的那么恐怖,之前我被误导了
2.我在弄的时候有No identities are available for signing 的错误,并且在target的bilding setting里面选不上证书,就是灰色的。最后的原因是:在创建app id时第二个项Bundle Identifier (App ID Suffix)没有设置好
3.一定要有一个发布证书
有一个朋友出现这个问题,是发布证书不能识别,对于这个问题,分三步解决,第一步,点击那个Organizer界面最下面的Refresh,要是依然是黄色感叹号,则第二步,右键删除不能识别的证书,再到苹果开发者网站下载那个发布证书,如果这样做后依然是黄色感叹号,那第三步,再苹果开发者网站移除掉那个发布证书,重新来,移除后,打开钥匙串,请求一个证书,然后提交,刷新一下界面然后重新下载,安装。如果还有问题,那就操作步骤有问题了。每一个步骤都不能错,这就是苹果的变态处
4.可能有各种问题
- You must provide a last name.
- You must upload at least one screenshot.
- You must provide an email address in a valid format (for example, support@example.com).
- You must provide a phone number in a valid format (for example, +1 123 456 7890).
- You must upload a large app icon.
- You must select a primary category for your app.
- App Description must be at least 10 characters in length.
- You must provide a first name.
-
- 对于这个问题是,是在填写Last Name时没有与你帐号的用户名相对应的结果
- 这个问题是因为你的appid与
不对应。假如你设置的appid是com.csc.*,那么你的Bundle Identifier应该是com.csc.calinks。calinks是我的项目名,是灰色的,无需自己修改,自己修改的只是前两个字段。类似的问题也有你在苹果开发者网站上填写Bundle ID Suffix与你的项目名不同造成的。
-
这个也有可能你选择的发布证书与这两者不对应,创建发布证书在选择appid时一定要看清了。这个就是前面说的3者要相对应。简单的说就是最好按照步骤一步步来。 - 原博客来至
http://blog.sina.com.cn/s/blog_68661bd801019uzd.html
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
引用“从一而终” ^_^
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;
★ 联系
1. 引用在语言内部用指针实现(如何实现?)。
2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。
引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n 是m 的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n 相当于m 的别名(绰号),对n 的任何操作就是对m 的操作。例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n 既不是m 的拷贝,也不是指向m 的指针,其实n就是m 它自己。
引用的一些规则如下:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
以下示例程序中,k 被初始化为i 的引用。语句k = j 并不能将k 修改成为j 的引用,只是把k 的值改变成为6.由于k 是i 的引用,所以i 的值也变成了6.
int i = 5;
int j = 6;
int &k = i;
k = j; // k 和i 的值都变成了6;
上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
以下是“值传递”的示例程序。由于Func1 函数体内的x是外部变量n 的一份拷贝,改变x 的值不会影响n, 所以n 的值仍然是0.
void Func1(int x)
{
x = x + 10;
}
int n = 0;
Func1(n);
cout << “n = ” << n << endl;// n = 0
以下是“指针传递”的示例程序。由于Func2 函数体内的x 是指向外部变量n 的指针,改变该指针的内容将导致n 的值改变,所以n 的值成为10.
void Func2(int *x)
{
(* x) = (* x) + 10;
}
⋯
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10
以下是“引用传递”的示例程序。由于Func3 函数体内的x 是外部变量n 的引用,x和n 是同一个东西,改变x 等于改变n,所以n 的值成为10.
void Func3(int &x)
{
x = x + 10;
}
⋯
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”
这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?
如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
——————————
摘自「高质量c++编程」
指针与引用,在MoreEffective C++ 的条款一有详细讲述,我给你转过来
条款一:指针与引用的区别
指针与引用看上去完全不同(指针用操作符‘*’和‘->’,引用使用操作符‘。’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
char *pc = 0;// 设置指针为空值
char& rc = *pc;// 让引用指向空值
这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
因为引用肯定会指向一个对象,在C里,引用应被初始化。
string& rs;// 错误,引用必须被初始化
string s("xyzzy");
string& rs = s;// 正确,rs指向s
指针没有这样的限制。
string *ps;// 未初始化的指针
// 合法但危险
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,它
} // 肯定指向一个double值
相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd)
{ // 检查是否为NULL
cout << *pd;
}
}
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍旧引用s1,
// 但是 s1的值现在是
// "Clancy"
ps = &s2; // ps 现在指向 s2;
// s1 没有改变
总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[].这个操作符典型的用法是返回一个目标对象,其能被赋值。
vector<int> v(10); // 建立整形向量(vector),大小为10;
// 向量是一个在标准C库中的一个模板(见条款35)
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
如果操作符[]返回一个指针,那么后一个语句就得这样写:
*v[5] = 10;
但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)
当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针假设你有
void func(int* p, int&r);
int a = 1;
int b = 1;
func(&a,b);
指针本身的值(地址值)是以passby value进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,
p = someotherpointer;//a is still 1
但能用指针来改变指针所指向的变量的值,
*p = 123131; // a now is 123131
但引用本身是以pass byreference进行的,改变其值即改变引用所对应的变量的值
r = 1231;// b now is 1231
尽可能使用引用,不得已时使用指针。
当你不需要“重新指向”时,引用一般优先于指针被选用。这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面,而指针用于对象内部。
上述的例外情况是函数的参数或返回值需要一个“临界”的引用时。这时通常最好返回/获取一个指针,并使用 NULL 指针来完成这个特殊的使命。(引用应该总是对象的别名,而不是被解除引用的NULL 指针)。
注意:由于在调用者的代码处,无法提供清晰的的引用语义,所以传统的 C 程序员有时并不喜欢引用。然而,当有了一些 C++ 经验后,你会很快认识到这是信息隐藏的一种形式,它是有益的而不是有害的。就如同,程序员应该针对要解决的问题写代码,而不是机器本身。
经过几天的折腾,终于搞定了。
现在和大家分享一下:
一、安装libevent
fastDFS需要安装libevent比较新的版本,将本机的比较低的版本卸载了。
rpm -qa libevent libevent-1.4.13-1.el6.x86_64 rpm -e --nodeps libevent
安装一个最新稳定版
wget https://github.com/downloads/libevent/libevent/libevent-2.0.18-stable.tar.gz tar zxvf libevent-2.0.18-stable.tar.gz cd libevent-2.0.18-stable ./configure make && make install
为libevent创建软链接到/lib库下,64位系统对应/lib64
ln -s /usr/local/lib/libevent* /lib/ ln -s /usr/local/lib/libevent* /lib64/
二、安装FastDFS
wget http://fastdfs.googlecode.com/files/FastDFS_v3.06.tar.gz tar zxvf FastDFS_v3.06.tar.gz cd FastDFS ./make.sh ./make.sh install
三、配置FastDFS
1、配置并启动 tracker server
①配置 tracker.conf
mkdir /data/fastdfs vim /etc/fdfs/tracker.conf base_path=/data/fastdfs http.server_port=8080 -> http.server_port=8020 ##include http.conf -> #include http.conf
②启动 tracker
/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
③开机启动
vim /etc/rc.local /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
2、配置并启动 storage server
①配置 storage.conf
mkdir /data/fastdfs mkdir /data/images vim /etc/fdfs/storage.conf base_path=/data/fastdfs store_path0=/data/images tracker_server=127.0.0.1:22122
②启动 tracker
/usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
③开机启动
vim /etc/rc.local /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
3、为storage节点安装fastdfs-nginx-module模块
①安装模块
安装Nginx详见:
需重新编译Nginx
wget http://fastdfs.googlecode.com/files/fastdfs-nginx-module_v1.10.tar.gz tar zxvf fastdfs-nginx-module_v1.10.tar.gz wget http://nginx.org/download/nginx-1.2.0.tar.gz tar zxvf nginx-1.2.0.tar.gz cd nginx-1.2.0 ./configure --prefix=/usr/local/nginx --add-module=../fastdfs-nginx-module/src make && make install cd ..
②配置
编辑nginx.conf
vim /usr/local/nginx/conf/nginx.conf #user nobody; user root; --如果下载遇到权限问题就改为root server { listen 8010; server_name localhost; location /M00 { alias /data/images/data; ngx_fastdfs_module; } ...... }
给 storage 的存储目录做一个软连接
ln -s /data/images/data/ /data/images/data/M00
拷贝mod_fastdfs.conf 到 /etc/fdfs/
cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ vim /etc/fdfs/mod_fastdfs.conf base_path=/data/fastdfs tracker_server=127.0.0.1:22122 store_path0=/data/images
启动nginx
/usr/local/nginx/sbin/nginx
四、使用FastDFS
1、上传文件
FastDFS安装包中,自带了客户端程序,通过程序可以进行文件上传。在使用这个客户端程序之前,首先需要配置client.conf,然后再进行文件上传及下载。
在tracker上修改客户端配置文件client.conf
vim /etc/fdfs/client.conf base_path=/data/fastdfs tracker_server=127.0.0.1:22122 1 2 vim a.html This Is FastDFS HELLO SONGYI.
上传文件
[root@uhzc006469 sy]# /usr/local/bin/fdfs_test /etc/fdfs/client.conf upload a.html This is FastDFS client test program v3.06 Copyright (C) 2008, Happy Fish / YuQing FastDFS may be copied only under the terms of the GNU General Public License V3, which may be found in the FastDFS source kit. Please visit the FastDFS Home Page http://www.csource.org/ for more detail. [2012-11-01 23:30:03] INFO - base_path=/home/sy/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0 tracker_query_storage_store_list_without_group: server 1. group_name=group1, ip_addr=223.4.155.155, port=23000 group_name=group1, ip_addr=223.4.155.155, port=23000 storage_upload_by_filename group_name=group1, remote_filename=M00/00/00/3wSbm1CSlXv7SNZHAAAAGmciNqs65.html source ip address: 223.4.155.155 file timestamp=2012-11-01 23:30:03 file size=26 file crc32=1730295467 file url: http://223.4.155.155:8010/group1/M00/00/00/3wSbm1CSlXv7SNZHAAAAGmciNqs65.html storage_upload_slave_by_filename group_name=group1, remote_filename=M00/00/00/3wSbm1CSlXv7SNZHAAAAGmciNqs65_big.html source ip address: 223.4.155.155 file timestamp=2012-11-01 23:30:03 file size=26 file crc32=1730295467 file url: http://223.4.155.155:8010/group1/M00/00/00/3wSbm1CSlXv7SNZHAAAAGmciNqs65_big.html
上传成功 大功告成!
试试用 地址栏:
http://223.4.155.155:8010/M00/00/00/3wSbm1CSlXv7SNZHAAAAGmciNqs65_big.html